次のファイルがあります。
//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
実際に使用したい場合は、grep
PCREとNULの区別データで機能します。ただし、このawk
バージョンは、人々が理解(および維持)するのがより困難であり、移植するのがより困難であることを示唆しています。
grep -zoP '(?<=\[runscript\]\n)(.|\n)*?(?=\[\/runscript\])' file
出力(表示されない末尾のNULを含む)
nc dec s10 s11
複数のゲーム(存在する場合)を処理するようにREを調整しました。