Вставьте несколько строк в файл после указанного шаблона с помощью оболочки script
Я хочу вставить несколько строк в файл с помощью оболочки script.
Давайте рассмотрим содержимое моего входного файла:
input.txt:
abcd
accd
cdef
line
web
Теперь мне нужно вставить четыре строки после строки 'cdef' в файле input.txt.
После вставки моего файла должно измениться следующим образом:
abcd
accd
cdef
line1
line2
line3
line4
line
web
Вышеуказанная вставка должна выполняться с использованием оболочки script. Может ли кто-нибудь мне помочь?
Ответы
Ответ 1
Другой sed
,
sed '/cdef/r add.txt' input.txt
input.txt:
abcd
accd
cdef
line
web
add.txt:
line1
line2
line3
line4
Тест:
sat:~# sed '/cdef/r add.txt' input.txt
abcd
accd
cdef
line1
line2
line3
line4
line
web
Если вы хотите применить изменения в файле input.txt
. Затем используйте -i
с sed
.
sed -i '/cdef/r add.txt' input.txt
Если вы хотите использовать регулярное выражение как выражение, вы должны использовать тег -E
с sed
.
sed -E '/RegexPattern/r add.txt' input.txt
Ответ 2
Использование GNU sed
:
sed "/cdef/aline1\nline2\nline3\nline4" input.txt
Если вы начали с:
abcd
accd
cdef
line
web
это создаст:
abcd
accd
cdef
line1
line2
line3
line4
line
web
Если вы хотите сохранить изменения в файле на месте, скажите:
sed -i "/cdef/aline1\nline2\nline3\nline4" input.txt
Ответ 3
sed '/^cdef$/r'<(
echo "line1"
echo "line2"
echo "line3"
echo "line4"
) -i -- input.txt
Ответ 4
Использование awk
:
awk '/cdef/{print $0 RS "line1" RS "line2" RS "line3" RS "line4";next}1' input.txt
Объяснение:
- Вы найдете строку, которую хотите вставить, используя
/.../
- Вы печатаете текущую строку с помощью
print $0
-
RS
- это встроенная переменная awk
, которая по умолчанию установлена на new-line
.
- Вы добавляете новые строки, разделенные этой переменной
-
1
в конце приводит к печати всех других строк. Используя next
, прежде чем он позволит нам предотвратить текущую строку, так как вы уже напечатали ее, используя print $0
.
$ awk '/cdef/{print $0 RS "line1" RS "line2" RS "line3" RS "line4";next}1' input.txt
abcd
accd
cdef
line1
line2
line3
line4
line
web
Чтобы внести изменения в файл, который вы можете сделать:
awk '...' input.txt > tmp && mv tmp input.txt
Ответ 5
Этот ответ легко понять
ШАГ 1 копировать до шаблона
sed '/THEPATTERNYOUARELOOKINGFOR/Q' $FILENAME >>${FILENAME}_temp
ШАГ 2 добавьте свои строки
cat << 'EOL' >> ${FILENAME}_temp
HERE YOU COPY AND
PASTE MULTIPLE
LINES, ALSO YOU CAN
//WRITE COMMENTS
AND NEW LINES
AND SPECIAL CHARS LIKE $THISONE
EOL
ШАГ 3 добавьте остальную часть файла
grep -A 9999 'THEPATTERNYOUARELOOKINGFOR' $FILENAME >>${FILENAME}_temp
ЗАМЕНИТЬ оригинальный файл
mv ${FILENAME}_temp $FILENAME
, если вам нужны переменные, на шаге 2 замените EOL на EOL
cat << EOL >> ${FILENAME}_temp
this variable will expand: $variable1
EOL
Ответ 6
Мне нужно было создать несколько файлов с минимальным набором инструментов, и для меня проблема с вышеупомянутым sed -e '/../r file.txt
заключается в том, что он добавляет файл только после того, как распечатывает остальную часть совпадения, но не заменяет его.
Это не делает этого (все совпадения заменяются, и сопоставление с образцом продолжается с той же точки)
#!/bin/bash
TEMPDIR=$(mktemp -d "${TMPDIR:-/tmp/}$(basename $0).XXXXXXXXXXXX")
# remove on exit
trap "rm -rf $TEMPDIR" EXIT
DCTEMPLATE=$TEMPDIR/dctemplate.txt
DCTEMPFILE=$TEMPDIR/dctempfile.txt
# template that will replace
printf "0replacement
1${SHELL} data
2anotherlinenoEOL" > $DCTEMPLATE
# test data
echo -e "xxy \n987 \nxx xx\n yz yxxyy" > $DCTEMPFILE
# print original for debug
echo "---8<--- $DCTEMPFILE"
cat $DCTEMPFILE
echo "---8<--- $DCTEMPLATE"
cat $DCTEMPLATE
echo "---8<---"
# replace 'xx' -> contents of $DCTEMPFILE
perl -e "our \$fname = '${DCTEMPLATE}';" -pe 's/xx/'cat $fname'/eg' ${DCTEMPFILE}
Ответ 7
Вы можете использовать awk
для вставки вывода какой-либо команды в середину input.txt
.
Вставляемые строки могут быть выходными данными cat otherfile
, ls -l
или 4 строк с числом, сгенерированным printf
.
awk 'NR==FNR {a[NR]=$0;next}
{print}
/cdef/ {for (i=1; i <= length(a); i++) { print a[i] }}'
<(printf "%s\n" line{1..4}) input.txt