LINUX.ORG.RU

Допустим у тебя есть файл 'myfile.txt' и тебе надо удалить строку, содержащую текст 'matches my regexp', строку перед ней и четыре строки после нее.

$ cat myfile.txt

вывод:

111111
22222
33333
44444
matches my regexp
5555
66666
777777
888888
999999

выполняем команду:

$ nl myfile.txt | grep -e '^\s*[0-9]\+\s\+\(matches my regexp\).*$' | head -n 1 | sed -e 's/^\s*\([0-9]\+\)\s\+.*$/\1 \1/' | xargs -n 2 printf 'head -n $((%s-2)) myfile.txt && tail -n +$((%s+5)) myfile.txt' | sh

вывод:

111111
22222
33333
999999

anonymous ()

Ну, вот если прямо в лоб, то можно так. Ищем пятёрочку и пляшем вокруг неё:

$ seq 1 12 | sed 's/.*/example_&_ok/' | sed 'N;/5/{N;N;N;N;d;};P;D;'
example_1_ok
example_2_ok
example_3_ok
example_10_ok
example_11_ok
example_12_ok
Только при таком шаблоне "-1; /x/; +4" будет ложное срабатывание при x=1 (так сказать, левый краевой случай) и не будет захвата шаблона при x>8 (правый краевой случай). Так что краевые случаи обрабатывай отдельно либо добавляй пустые строки слева/справа перед обработкой.

justAmoment ★★★★★ ()

по примеру файла из первого коммента:

perl -ne 'BEGIN{undef $/} print ${^PREMATCH}.${^POSTMATCH} if /.*\nmatches my regexp(.*\n){4}.*\n/p' file.txt

Deleted ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.