Вернуть предыдущую строку всего match

На основе ответа G-Man и комментария:

sed -i '/#start/,/#end/ {
//!d
/#start/a\
some new text\
more lines\
end of new text (no backslash here!)
}' myconfig

Объяснение:

  1. / # start /, / # end / {....} выполняет команды в фигурных скобки для каждой строки между текстом «#start» и «#end» (включительно). Сравните ответ G-Man.
  2. a - это команда добавления. Он выполняется только в строке, соответствующей "#start", чтобы добавить новый текст. Он добавляет строки до тех пор, пока не появится строка, которая не заканчивается обратной косой чертой + новой строкой.

4
14.11.2017, 01:16
2 ответа

Почему бы просто не сделать это проще и не использовать ex, который имеет обратную -адресацию:

printf '%s\n' 'g/input/-p' | ex file.txt

Запуск в конвейере, а не в файле, выглядит немного сложнее, но работает так же:

jack_lsp -p | ex -s /dev/stdin -c $'g/input/-p\nq'
3
27.01.2020, 20:46

Этот фрагмент:

# 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

С наилучшими пожеланиями... ура, дрл

0
27.01.2020, 20:46

Теги

Похожие вопросы