На основе ответа G-Man и комментария:
sed -i '/#start/,/#end/ {
//!d
/#start/a\
some new text\
more lines\
end of new text (no backslash here!)
}' myconfig
Объяснение:
/ # start /, / # end / {....}
выполняет команды в фигурных скобки для каждой строки между текстом «#start» и «#end» (включительно). Сравните ответ G-Man. a
- это команда добавления. Он выполняется только в строке, соответствующей "#start", чтобы добавить новый текст. Он добавляет строки до тех пор, пока не появится строка, которая не заканчивается обратной косой чертой + новой строкой. Почему бы просто не сделать это проще и не использовать ex
, который имеет обратную -адресацию:
printf '%s\n' 'g/input/-p' | ex file.txt
Запуск в конвейере, а не в файле, выглядит немного сложнее, но работает так же:
jack_lsp -p | ex -s /dev/stdin -c $'g/input/-p\nq'
Этот фрагмент:
# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }
pl " Input data file $FILE:"
head $FILE
pl " Expected output:"
cat $E
pl " Results:"
rm -f f1
ed --silent $FILE > f1 <<EOF
g/input/.-1p
q
EOF
head f1
производит:
-----
Input data file data1:
firewire_pcm:analog-1_out
properties: input,physical,terminal,
firewire_pcm:analog-2_out
properties: input,physical,terminal,
firewire_pcm:analog-1_in
properties: output,physical,terminal,
firewire_pcm:analog-2_in
properties: output,physical,terminal,
-----
Expected output:
firewire_pcm:analog-1_out
firewire_pcm:analog-2_out
-----
Results:
firewire_pcm:analog-1_out
firewire_pcm:analog-2_out
Команда ed просто :1 )найти строку, которая соответствует «вводу» 2 )напечатать предыдущую строку.
Запуск в такой системе, как:
OS, ker|rel, machine: Linux, 3.16.0-4-amd64, x86_64
Distribution : Debian 8.9 (jessie)
ed GNU Ed 1.10
С наилучшими пожеланиями... ура, дрл