используйте sed для замены строки в файле несколькими строками из stdin или HEREDOC - PullRequest
0 голосов
/ 03 февраля 2019

Я хочу заменить строку в файле несколькими строками.Я знаю, что могу использовать \n вместо sed, но это довольно уродливо.Я надеялся на HEARDOC.

Так что я могу сделать это, чтобы заменить строку несколькими строками:

$ cat sedtest
DINGO=bingo

$ sed -i -e "s/^DINGO.*$/# added by $(whoami) on $(date)\nDINGO=howdy/" sedtest

$ cat sedtest
# added by user on Sun Feb  3 08:55:44 EST 2019
DINGO=howdy

В команде я хочу поместить замену в новые строки, чтобы было легчечтения / понимания.До сих пор я использовал HEREDOC, когда хочу добавить новых строк в файл:

CAT << EOF | sudo tee -a file1 file2 file3
line one
line two
line three
EOF

И это хорошо сработало для добавления / добавления.Можно ли сделать что-то подобное, но вместо этого использовать вывод в качестве замены в sed или есть какой-то другой способ сделать то, что я ищу?

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Это может сработать для вас (GNU sed):

cat <<! | sed -i -e '/^DINGO/r /dev/stdin' -e '//d' file
# added by $(whoami) on $(date)
DINGO=howdy
!

Заменяет строки, начинающиеся с DINGO, следующим документом, который передается в stdin как файл в команде sed.

Альтернатива:

cat <<! | sed -i -e '/^DINGO/e cat /dev/stdin' -e 's/bingo/howdy' file
# added by $(whoami) on $(date)
!

Примечание. В альтернативном решении документ здесь будет прочитан только один раз!

0 голосов
/ 03 февраля 2019

Это то, что вы пытаетесь сделать?

$ awk 'NR==FNR{new=(NR>1?new ORS:"") $0;next} $0=="DINGO=bingo"{$0=new} 1' - file <<!
# added by $(whoami) on $(date)
DINGO=howdy
!
# added by user on Sun, Feb  3, 2019  8:50:41 AM
DINGO=howdy

Обратите внимание, что вышеприведенное использует буквенные строковые операции, поэтому оно будет работать для любых символов в старых или новых строках в отличие от вашего сценария sed, которыйзавершится с ошибкой, если / s или любой другой символ регулярного выражения ERE или захватить группы или обратные ссылки или ... во входных данных (см. Можно ли надежно экранировать метасимволы регулярных выражений с помощью sed ).

...