选择上方和下方有空行的行

选择上方和下方有空行的行

我的输出如下所示:

A
A
A

B

A
A
A

C

A
...

我想过滤被空行包围的行。
在这个例子中,它将是B等等C

答案1

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

答案2

尝试:

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

这会报告只有一行的段落。

从技术上讲,如果文件包含:

A

B
C

D

E

这也会报告AE即使它们前面(后面)没有空行。

如果你只想要D上面的内容,你可以这样做:

awk '
  {
    if ($0 != "") {
      ok = wasempty
      wasempty = 0
    } else {
      if (ok) print last
      ok = 0
      wasempty = 1
    }
  }
  ok {last = $0}'

答案3

如果第一行/最后一行被排除,因为它们两边不能有空行:

$ 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~/./ && /^$/匹配给定条件,假设空行匹配不应该有空格并且要匹配的行不为空

答案4

perl -l -0777ne 'print for /(?:^|\n)\n\K.+(?=\n\n)/g' yourfile

解释:

我们读取文件,然后整个文件就是一条记录。在该单个记录中,我们放大了前面islands有 2 个连续行开头、后面有 2 个换行符的记录。所有这些islands都是由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

相关内容