Подставить строку с содержимым файла в sed - PullRequest
0 голосов
/ 01 ноября 2018

Я заблудился, пытаясь сделать следующую замену с помощью sed:

@ edit: чтобы понять всю сложность моей проблемы, Я добавил тот факт, что имена файлов содержатся в переменных впоследствии. Поэтому решения могут напрямую использовать имена файлов.

с учетом переменной I = 'insert.txt':

'insert.txt':

Text I wanna skip.

This is text to insert containing
spaces and new lines

с учетом переменной M = 'toModify.txt':

toModify.txt ':

Insert the new text: here.

Я бы хотел заменить «здесь» из $ M на содержимое из $ I:

Insert the new text: This is text to insert containing
spaces and new lines.

Я пытался:

sed -e "s/here/$(tail -n2 $I | sed -e 's/ /\\ /g' | tr '\n' '\\n')/" $M

с ошибкой: sed неопределенная команда `s '

Проблема в том, что я не получаю пробелы и новые строки без завершения команды s.

Есть решение?

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Нельзя заменить один символ двумя на tr. Избегать отдельных пространств в любом случае бессмысленно. Причиной немедленной ошибки является то, что вы в конечном итоге тоже избегаете последней косой черты:

linux$ tail -n2 "$I" | sed -e 's/ /\\ /g' | tr '\n' '\\n'
This\ is\ text\ to\ insert\ containing\spaces\ and\ new\ lines\/

Бежать в любом случае бессмысленно. Я думаю, вы хотите что-то вроде этого:

linux$ sed '1,2d;$!s/$/\\/' "$I"
This is text to insert containing\
spaces and new lines

Удаляем строки 1 и две; затем добавьте обратную косую черту перед каждым символом новой строки, кроме последнего.

linux$ sed -e "s/here/$(sed '1,2d;$!s/$/\\/' "$I")/" "$M"
Insert the new text: This is text to insert containing
spaces and new lines.

Это одна деталь sed, которая не является полностью переносимой. Но вышесказанное работает для меня на Linux и MacOS. (Обратите внимание, что вам может потребоваться set +H, чтобы отключить csh -стиль раскрытия истории в стиле -bash: !s/$/\\/': event not found ошибки).

0 голосов
/ 02 ноября 2018

Использование Perl однострочного

> cat insert.txt
This is text to insert containing
spaces and new lines
> cat toModify.txt
Insert the new text: here
> export I=insert.txt
> export M=toModify.txt
> perl -ne 'BEGIN{$x=qx(cat $ENV{M});$x=~s/here/qx(cat $ENV{I})/e; print $x;exit }'
Insert the new text: This is text to insert containing
spaces and new lines

>
0 голосов
/ 01 ноября 2018

Вы можете использовать это awk:

awk 'BEGIN{prs=RS; RS=""; getline s < "insert.txt"; RS=prs}
{gsub(/here/, s)} 1' toModify.txt

Insert the new text: This is text to insert containing
spaces and new lines.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...