CLI で正規表現を使用する Grep は何も返しません。

CLI で正規表現を使用する Grep は何も返しません。

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

//TESTCASES=3
//MARK=9

[runscript]
nc dec s10 s11
[/runscript]

[checks]

[/checks]

[testcase]
// List: 1, 2, 3, 5, 0xA, -1
.global LIST
.data
LIST: 
.word 1, 2, 3, 5, 0xA, -1
[/testcase]

grepとregexの使用[runscript]の間にテキストを取得しようとしています。[/runscript]

正規表現が独立して動作することを確認しました。

(?<=\[runscript\]\n)(.|\n)*(?=\[\/runscript\])

しかし、grepは何も返しません。オプションの問題ですか?私はこれらのアプローチの多くを個別にまたは組み合わせて試しました。

-P、-e、-E、-w、-o

私は何を見逃していますか?

答え1

grep一度に 1 行だけ処理されるため、正規表現に一致する内容には改行文字は含まれません。

perl / PCRE演算子を使用したいので、一致の一部を報告するように指示できるpcregrep複数行のパターンでsumを使用できます。-M

pcregrep -xMo1 '(?s)\[runscript\]\n(.*?)\n\[/runscript]'

または:

pcregrep -xMo1 '(?s)\[runscript\]\r?\n(.*?)\n\[/runscript]\r?'

MS-DOSスタイルCRLF行区切り文字を許可します(ここでCRが入力にある場合は出力にも含まれます)。

答え2

私はgrep代わりに使用しませんawk

awk '
    $0=="[runscript]" {rs++; next}
    $0=="[/runscript]" {rs--}
    rs {print}
' file

出力

nc dec s10 s11

実際に使用したい場合は、grepPCREとNULの区別データで機能します。ただし、このawkバージョンは、人々が理解(および維持)するのがより困難であり、移植するのがより困難であることを示唆しています。

grep -zoP '(?<=\[runscript\]\n)(.|\n)*?(?=\[\/runscript\])' file

出力(表示されない末尾のNULを含む)

nc dec s10 s11

複数のゲーム(存在する場合)を処理するようにREを調整しました。

関連情報