^# 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