真珠

真珠

^# fish,埋め込み行から次の埋め込み行まで(含まずに)ファイル内のすべての行を印刷する良い方法は何ですか^#

答え1

AWKを使用:

awk '/^#/ { inblock = 0 }; /^# fish/ { inblock = 1 }; inblock'

これにより、実際に始まるすべてのブロックが印刷されます# fish。最初のブロックの後に停止するには:

awk 'inblock && /^#/ { exit }; /^# fish/ { inblock = 1 }; inblock'

inblock両方のバリアントは、関心のあるブロックの行を処理するときに変数を1に設定することで機能します。 1の場合、最後のinblockステートメントはデフォルトのジョブ(現在の行印刷)を適用します。inblock

答え2

真珠

正規表現の反復は、line boundary # fish改行文字に隣接する最も短い(貪欲ではない)ブロック、またはファイル自体の最後から始まり終わるブロックを探します。#次に、一致する部分を印刷します。

perl -l -0777ne 'print $& while /^#\sfish.+?(?=\n(?:#|\z))/msg' yourfile


sed -e '
   /^# fish/!d;          # havent yet seen the fish, so skip
   $b; N;                # seen the fish so grab the next line unless its the last in which case promptly show and quit
   /\n#/!s/^/\n/;        # not seen a line with "#" so go read next
   /^\n/D;               # 
   h;                    # whole block /# fish/.../#/ with us now
      s/\(.*\)\n.*/\1/;  # remove the last line, i.e., trailing # line
      p;                 # show the block now
   g;                    # retrieve orig unmodified block
   s/.*\n/\n/; D;        # keep the last line and go back for more...
' yourfile

関連情報