По этой ссылке на указанную вами спецификацию 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 [\] [+]'
).
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
Попробуйте:
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}'
Если первые/последние строки исключены, потому что они не могут иметь пустых строк с обеих сторон:
$ 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~/. / && /^$/
соответствие заданному условию, предполагает, что пустая строка не должна иметь пробелов и строка для соответствия НЕ пустая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