
Я действительно пытался искать, но ничего не нашел (трудно понять, что именно искать).
Я знаю, как это сделать с помощью sed
: распечатать от текущей строки до строки, которая соответствует ЧТО-ТО:
sed -n '/1/,/SOMETHING/p'
Но как мне сделать то же самое, но печатать с текущей строки до строки, котораянесоответствует ЧЕМ-ТО?
например, передать это в sed
:
blah blah SOMETHING blah blah
blah blah SOMETHINGblahblahblah
SOMETHING blah blah
NO MATCH HERE
Затем я хочу отфильтровать и вывести только первые 3 строки (но «3» может варьироваться).
решение1
Это может быть не совсем то, что вам нужно, но вот отправная точка:
sed -n '/SOMETHING/!q;p'
Это говорит: проверьте на соответствие /SOMETHING/
. Если строкане совпадает(используя !
для инвертирования результата теста), затем выйти. В противном случае вывести эту строку и перейти к следующей строке.
Это не позволяет вам сразу сделать то, что вы просили, а также выполнить другие манипуляции с файлом в одной sed
команде.
решение2
Вы можете попробовать цикл sed
:
$ sed -n '{:loop p; n; /SOMETHING/b loop; q}' test.txt
blah blah SOMETHING blah blah
blah blah SOMETHINGblahblahblah
SOMETHING blah blah
Этот:
:loop
создает метку с именемloop
p
печатает текущую строкуn
извлекает следующую строку/SOMETHING/b loop
переходы кloop
, если строка совпадает/SOMETHING/
q
если ответвление не произойдет.
В любом случае выводится одна строка. (Вероятно, это можно исправить с помощью ответа G-Man.)
Адаптирован изэтот ТАК вопрос.