Grep Pattern Следующие две строки и отбросьте шаблон одной строкой

Есть несколько способов решить эту проблему:

  1. sed / \ r \? $ / A / 'file_list.txt
  2. awk' {print $ 0 "A"} 'RS = "\ r * \ n \ r *" file_list.txt
  3. awk -F' \ r '' {print $ 1 "A"} 'file_list.txt
  4. ...

Наконец-то получил широкое распространение:

tr -d '\r' <file_list.txt | do_what_ever_want
-1
23.01.2019, 12:50
2 ответа

Я запускаю приведенную выше команду и работает отлично,

awk -v RS="\n\n" -v FS="\n" -v ORS="\n\n" 'NF>2 {print $0}' 

блоки с разделителями пустые,это работает отлично.

-1
28.01.2020, 05:12

Это может сработать:

$ awk -v RS="dn: " -v FS="\n" -v ORS="" 'NF>3 {print "dn:",$0}' input.txt

Мы определяем dn:как разделитель записей. Поля в одной записи разделяются символом новой строки \n.

Если у вас есть две строки после строки, начинающейся с dn:, до того, как новая запись начнется с dn:, у вас будет 3 раза "\n", ведущих к 4 полям в записи. Вот почему мы проверяем, есть ли в записи более 3 полей (NF>3). Если это так, мы распечатываем всю запись, но должны добавить dn:.

Обратите внимание, что NF>3найдет все записи с более чем двумя следующими строками в одной записи. Если вы хотите, чтобы только те, у кого ровно два, измените его на NF==3.

Если блоки разделены пустой строкой (, как показано в одном из ваших более поздних комментариев ), используйте вместо этого:

$ awk -v RS="\n\n" -v FS="\n" -v ORS="\n\n" 'NF>2 {print $0}' input.txt
1
28.01.2020, 05:12

Теги

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