Выберите строку с пустой строкой над и под

По этой ссылке на указанную вами спецификацию POSIX можно прочитать:

Обычный символ - это BRE, который соответствует самому себе: любой символ в поддерживаемом наборе символов, за исключением специальных символов BRE, перечисленных в BRE Special Characters.

Интерпретация обычного символа, которому предшествует ('\'), не определена, за исключением:

  • символов ')', '(', '{' и '}'
  • Цифры 1 до 9 включительно (см. Сопоставление нескольких символов BRE)
  • Символ внутри выражения в квадратных скобках

Итак, в основном, поскольку + является обычным символом BRE, поведение grep 'x \ + ' не указано, некоторые реализации, такие как GNU grep , обрабатывают его так же, как grep' x \ {1, \} ' ( grep -E' x + '), некоторые из них такие же, как grep 'x +' , некоторые могут рассматривать как grep 'x \\ +' или что-то еще.

Итак, если вы хотите сопоставьте строку x \ + переносимо, вы должны написать grep 'x \\ +' (или grep 'x [\] +' , или ] grep -F 'x \ +' или grep -E 'x \\\ +' или grep -E 'x [\] [+]' ).

1
25.05.2019, 22:25
4 ответа

awk читает ввод как "абзацы", или записи, разделенные пустыми строками, если RS установлен на пустую строку (GNU awk). (Установка RS в \n\n+ похожа, но не совсем). Затем можно вывести все записи, не содержащие новой строки:

$ awk -vRS= '$0 !~ /\n/' file1
B
C

Это выведет также первую и последнюю строки, если за ними следует или им предшествует пустая строка, соответственно, фактически рассматривая начало и конец файла как "пустые строки". Если вам нужны действительно пустые строки, то подойдет что-то вроде этого:

awk 'BEGIN {lines=2} /^$/ {if (lines == 1) print prev; lines=0 } 
     !/^$/ {lines += 1}  {prev=$0}' file1
3
29.04.2021, 00:02

Попробуйте:

awk -v RS= '!/\n/'

Это сообщает о параграфах, содержащих только одну строку.

Технически, если файл содержит:

A

B
C

D

E

Это также сообщит о A и E, даже если им не предшествует (соответственно, не следует) пустая строка.

Если вам нужен только D выше, вы можете сделать:

awk '
  {
    if ($0 != "") {
      ok = wasempty
      wasempty = 0
    } else {
      if (ok) print last
      ok = 0
      wasempty = 1
    }
  }
  ok {last = $0}'
1
29.04.2021, 00:02

Если первые/последние строки исключены, потому что они не могут иметь пустых строк с обеих сторон:

$ cat ip.txt 
A0

B1

A2

A
A

C3

AN
$ awk 'NR>=3 && p2~/^$/ && p1~/./ && /^$/{print p1} {p2=p1; p1=$0}' ip.txt 
B1
A2
C3
  • NR>=3 нужно как минимум 3 строки для соответствия условию
  • {p2=p1; p1=$0} сохранение последней строки в p1 и предпоследней строки в p2
  • p2~/^$/ && p1~/. / && /^$/ соответствие заданному условию, предполагает, что пустая строка не должна иметь пробелов и строка для соответствия НЕ пустая
1
29.04.2021, 00:02
perl -l -0777ne 'print for /(?:^|\n)\n\K.+(?=\n\n)/g' yourfile

Объяснение:

Мы сжимаем файл, и весь файл представляет собой одну запись. В этой единственной записи мы увеличиваем острова, которым предшествуют 2 последовательных начала строки и за которыми следуют 2 новые строки. Все такие острова печатаются циклом for.


sed -e '
   /./d      # skip a nonempty line
   $!N       # grab the line following an empty line
   /^\n$/D   # if we have 2 consecutive empties, clip the former, n branch to top
   $!N       # we now have ^\nLine\n...
   /\n$/!D   # clip if the seq ^\nLine\n$ not found
   s/.//     # found it! ^\nLine\n$
   P;D       # 
' yourfile
0
29.04.2021, 00:02

Теги

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