Еще один канонический инструмент, который вы рассматривали awk
, можно использовать со следующей строкой:
awk -F"stalled" '/stalled/{print $2}' messages
Подробное объяснение:
-F
определяет разделитель для строки, т. е. «остановка». Все до разделителя адресуется с помощью $1
, а все после с помощью $2
. /reg-ex/
Ищет подходящее регулярное выражение, в данном случае "остановлено". {print $<n>}
-выводит n столбцов. Поскольку ваш разделитель определен как остановленный, все после остановленного считается вторым столбцом. sed — лучший инструмент для выполнения s/old/new в отдельных строках, для всего остального просто используйте awk;
$ awk -v n=4 '/num/ && ((++c) == n){$0="num x"} {print}' file
START
num 1
num 1
num 1
num x
END
Ваше регулярное выражение было не совсем правильным.
$ sed ':a;N;$!ba; s/\nnum[^\n]*/\nnum x/4' file