最初の一致パターンまで行範囲を取得する

最初の一致パターンまで行範囲を取得する

次のファイルがあります。

line1
line2
line3
line4
line5
line6
line7
line5
line2

line1との間のデータを取得したいですline5。私はそれを使用しましたawk '/line1/,/line5/' myfile。予想される出力は次のとおりです。

line1
line2
line3
line4
line5

しかし、awkは最後の試合まで読みますline5。私はawkが最後の試合ではなく、最初の試合で停止したいと思います。

答え1

問題を再現できません。 awk *は私が期待どおりに行います。最初の出現の間からline1最初の出現までのすべての行を印刷しますline5

$ awk '/line1/,/line5/' file
line1
line2
line3
line4
line5

line5ファイルの5行目の文字列に印刷されない隠し文字がありますか?これがawk一致しない理由を説明します。


そのコマンドを実行して再確認できますsed

$ sed -n '/line1/,/line5/p' file
line1
line2
line3
line4
line5

すべての行を印刷しない(デフォルトの動作)を示しますが、最初の出現から最初の出現までのすべての-n行を印刷するように指示します。sed/line1/,/line5/pline1line5


ただ印刷したい場合最初パターンに一致する行で始まりline1、一致する行で終わる行セットを作成するには、line5次のようにします。

sed -n '/line1/,$p;/line5/q' file

*gawk GNU実装を使用して確認しました(KusalanandaはこれがawkOpenBSDでもawk正しいmawkことをすることを確認しました)。

答え2

以下を使用できますawk

awk '/line1/{prnt=1} prnt{print} /line5/{exit}' infile

line1次の最初の行が一致するまで、一致する行を印刷してline5すぐに終了します。

答え3

awk '/foo/,/bar/'

印刷みんなfoo一致する行で始まり、次の一致する行(または同等の行の反対側と同じ行)で終わるsedファイルの一部barです(正規表現はline1includeを含む行とも一致します)。line1anythingline10

似合いたい場合最初line1一致する行で始まり、次の一致する行(または同じ行)で終わるセクションの場合は、次のことがline5できます。

sed '/line1/,$!d;/line5/q' < file

line5(最初の一致行の後に一致する行がない場合は、その行からファイルの終わりまでline1印刷されます。パターンは次のようになります。line1sed基本的な正規表現ですが、awkこれは拡張式です)。

関連情報