複数行grep - この表現にはどのような問題がありますか?

複数行grep - この表現にはどのような問題がありますか?

次のサンプルファイルを検討してください(行番号は参照用です)。

1 Reference duiarneutdigane uditraenturida enudtiar.
2
3 Reference uiae uiaetrtdnsu iatdne uiatrdenu diaren uidtae
4 on line 23.
5
6 uiae
7
8 uaiernd Reference uriadne udtiraeb unledut iaeru uilaedr
9 uiarnde line 234.

このgrepコマンド(tstはサンプルファイル)を使用して、「Reference」で始まり、ピリオドで終わるすべての文字列(例:ll.1、3–4、8–9)を一致させたいと思います。

grep -P '(?s)Reference.*?\.' tst

ただし、最初の行にのみ一致します。私は何を考えていますか?

  • (?s).改行文字を含むすべての文字と一致します。
  • .*?アスタリスクは、貪欲に作られていてピリオドで終わる場合、ファイル全体と一致しません。
  • 式はピリオドで終わる必要があります\.

-z私もawkとgrepのフラグを試しましたが、両方の方法を使用してすべての行を取得するか、すべての行が私の表現と一致しません。

ベストアンサー1

以下を使用できます。

grep -Pzo '(?s)Reference.*?\.' tst.txt

tst.txt入力ファイルはどこにありますか?正規表現と同じですが、2つの新しいフラグがあります。

-z行末で改行を抑制し、それをnull文字に置き換えるフラグを追加しました。したがって、grep行の終わりがどこにあるかはわかりますが、入力を1つの大きな行として扱います。

この-oフラグは、一致する部分だけを印刷することを意味します。

次の結果が表示されます。

Reference duiarneutdigane uditraenturida enudtiar.
Reference uiae uiaetrtdnsu iatdne uiatrdenu diaren uidtae
on line 23.
Reference uriadne udtiraeb unledut iaeru uilaedr
uiarnde line 234.

おすすめ記事