LINUX.ORG.RU

sed: очистить/удалить предыдущую/следующую строку по условию

 ,


0

3

Здравствуйте! Просьба помочь выполнить следующую задачу: Необходимо написать однострочники sed, реализующие следующие функции:

  • Если строка содержит текст, удалить следующую строку;
  • Если строка содержит текст, очистить следующую строку;
  • Если строка содержит текст, удалить предыдущую строку;
  • Если строка содержит текст, очистить предыдущую строку.

Понимаю, что для этой цели нужно использовать конструкцию вида:

sed -e ":a;/IF/N;s/THEN$/\n/g;ta;"
или что-то подобное, но не понимаю, как это сделать, особенно удаление. В случае с удалением, я пытаюсь использовать невидимый символ x0D, который удалиться в следующем пайпе, например:
sed -e ":a;/-$/N;s/\x0A.\+$/\x0D/g;ta;"
данный однострочник удалит следующую строку, если строка заканчивается на "-", но получается как-то коряво.

PS: прошу прощения, сейчас нет linux под рукой, использую unixutils.


я пытаюсь использовать невидимый символ x0D, который удалиться в следующем пайпе

лучше использовать hold buffer, манипуляции с которым осуществляются командами h/H, g/G, x

salsa ()

1) sed '/text/ { N ; s/\n.*$// ; }'
2) sed '/text/ { N ; s/\(\n\).*$/\1/ ; }'
3-4) см. работу с hold space.

ABW ★★★★ ()

1 и 4:

sed -n 'p; /text/n'
sed '1{h; d}; /text/!{x; b}; x; с\'

два text подряд не переживает

Если условия более сложные, то, наверное, лучше взять перл. Там хоть тернарные операторы есть. Под офтопик отлично работет ActivePerl, если что.

Jini ★★ ()
Последнее исправление: Jini (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.