grep одна строка перед соответствием плюс соответствие

Попытка:

less -S +F filename

  • Нажмите Ctrlc, чтобы прекратить выслеживать, и теперь можно переместить левые и правые клавиши управления курсором использования.
  • Нажмите Shiftf, чтобы продолжить выслеживать
  • Нажмите Ctrlc, q для выхода
8
23.08.2015, 00:02
2 ответа

Можно сделать:

grep -B 1 '&$' your_file

Это будет искать строки, заканчивающиеся в &, удалить $ соответствовать строкам & где угодно в них.

-B переключатель говорит grep производить строки "контекста", которые прибывают перед строками то соответствие. В этом случае, так как Вы хотите одну строку контекста, Вам нужно -B 1.

Этот переключатель доступен в GNU grep но не находится в стандарте POSIX, все же.

Вот простое sed решение, которое должно помочь в случае, если у Вас нет GNU grep:

sed -n '/&/!N;/&/p' your_file

Как это работает

  • -n переключатель подавляет действие "печати" по умолчанию sed
  • /&/!N средства: если текущая строка не содержит &, добавьте следующую строку к пространству шаблона.
  • /&/p средства: соответствие & и распечатайте пространство шаблона.
15
27.01.2020, 20:09
  • 1
    @RanaKhan Добро пожаловать для Укладки Exchange :) Я рад, что мог помочь. Не забывайте отмечать этот ответ, как принято (используйте метку ниже кнопок голосования рядом с ответом), если это помогло решить Вашу проблему так, чтобы другие, просматривающие сайт, знали, что эта проблема решена. –  Joseph R. 06.11.2013, 00:09

Вот как эмулировать grep -B1 с sed :

sed '$!N;/pattern/P;D' infile

Он очень похож на здесь . Как и предыдущий, он читает в строке N ext, но на этот раз P запускается до первой \ n ewline if ] пространство шаблонов совпадает с , а затем, как и другое, D выбирается до первой \ n ewline и перезапускает цикл. Итак, с вашим примером ввода:

sed '$!N;/&/P;D' infile

output:

aaaaaaaaa
bbbbbbbbb &
ccccccccc &
eeeeeeeee
fffffffff &
ggggggggg &

Опять же, чтобы увидеть, как это работает, добавьте l до и после N , чтобы посмотреть на пространство шаблонов ::

sed 'l;$!N;l;/&/P;D' infile

например с образцом файла:

zzzz &
aaaa
bbbb
cccc &
dddd &
hhhh
eeee
ffff &
gggg &

это команды, которые выполняет sed , и соответствующий вывод:

cmd        output            cmd
l       zzzz &$               N # read in the next line
l       zzzz &\naaaa$         # pattern space matches so print up to \n
P       zzzz &                D # delete up to \n 
l       aaaa$                 N # read in the next line
l       aaaa\nbbbb$           D # delete up to \n (no match so no P)
l       bbbb$                 N # read in the next line
l       bbbb\ncccc &$         # pattern space matches so print up to \n
P       bbbb                  D # delete up to \n
l       cccc &$               N # read in the next line
l       cccc &\ndddd &$       # pattern space matches so print up to \n
P       cccc &                D # delete up to \n
l       dddd &$               N # read in the next line
l       dddd &\nhhhh$         # pattern space matches so print up to \n
P       dddd &                D # delete up to \n
l       hhhh$                 N # read in the next line
l       hhhh\neeee$           D # delete up to \n (no match so no P)
l       eeee$                 N # read in the next line
l       eeee\nffff &$         # pattern space matches so print up to \n
P       eeee                  D # delete up to \n
l       ffff &$               N # read in the next line
l       ffff &\ngggg &$       # pattern space matches so print up to \n
P       ffff &                D # delete up to \n
l       gggg &$               # last line so no N 
l       gggg &$               # pattern space matches so print up to \n
P       gggg &                D # delete up to \n
3
27.01.2020, 20:09

Теги

Похожие вопросы