Стандартный синтаксис для команды a
::
sed -e 'a\
first line\
second line\
last line'
BSD (по крайней мере, FreeBSD и OS/X)sed
удаляют начальные пробелы , а требуется -e
для устранения ошибки . GNU sed
позволяет переместить первую строку сразу после a\
, если она не -пуста.
Итак, вам нужно предварительно обработать ввод:
VAR='content with
multiple lines
some with lead blanks
or even backslash\'
preprocessed_VAR=$(printf '%s\n' "$VAR" |
sed 's/\\/&&/g;s/^[[:blank:]]/\\&/;s/$/\\/')
sed -i -e "/MatchingPattern/a\\
${preprocessed_VAR%?}" somefile
(замените -i
на -i ''
во FreeBSD или OS/X ).
В GNU/Linux и с оболочкой GNU(bash
)или zsh
вы можете вместо этого:
sed -i '/MatchingPattern/r /dev/stdin' <<< "$VAR"
Это работает, потому что bash
и zsh
реализуют здесь -строки с удаленными временными файлами, а /dev/stdin в Linux реализован как символическая ссылка на файл (, что означает, что его можно открыть несколько раз, и каждый раз он открыт в начале ).
Здесь вы также можете использовать GNU awk
вместо:
(export VAR
gawk -i inplace '{print}; /MatchingPattern/{print ENVIRON["VAR"]}' somefile)
Илиperl
(откуда это -i
исходит):
(export VAR
perl -pi -e '$_.= "$ENV{VAR}\n" if /MatchingPattern/' somefile)
Для этого можно создать функцию, подобную следующей:
less_all_commands(){
while read -ra c;do
"${c[@]}"|less;
done;
}
Выполнив эту функцию, все ваши команды будут переданы в less
.
Выйдите из этой функции (Ctrl + C
), вы вернетесь в свою обычную среду оболочки.