Совпадение от текущей строки до строки, которая не соответствует шаблону

Совпадение от текущей строки до строки, которая не соответствует шаблону

Я действительно пытался искать, но ничего не нашел (трудно понять, что именно искать).

Я знаю, как это сделать с помощью 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.)

Адаптирован изэтот ТАК вопрос.

Связанный контент