上下に空行がある行を選択

上下に空行がある行を選択

私の出力は次のとおりです

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/'

1行だけの段落を報告します。

技術的には、ファイルに以下が含まれている場合:

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}'

答え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

説明する:

私たちはファイルを読み取り、ファイル全体はレコードです。この単一レコードでは、islands2つの連続した行で始まり、その後に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

関連情報