Подтвердить что ты не робот

Вставьте несколько строк в файл после указанного шаблона с помощью оболочки script

Я хочу вставить несколько строк в файл с помощью оболочки script. Давайте рассмотрим содержимое моего входного файла: input.txt:

abcd
accd
cdef
line
web

Теперь мне нужно вставить четыре строки после строки 'cdef' в файле input.txt. После вставки моего файла должно измениться следующим образом:

abcd
accd
cdef
line1
line2
line3
line4
line
web

Вышеуказанная вставка должна выполняться с использованием оболочки script. Может ли кто-нибудь мне помочь?

4b9b3361

Ответ 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

Этот ответ легко понять

  • Копировать перед шаблоном
  • Добавьте свои строки
  • Копировать после шаблона
  • Заменить исходный файл

    FILENAME = "приложение/Поставщики/AuthServiceProvider.php

ШАГ 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