
次のサンプルファイルを検討してください(行番号は参照用です)。
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.