次の形式のTOMLファイルがあります(カテゴリには任意の名前を持つことができ、シリアル番号は単なる例であり、保証されません)。
[CATEGORY_1]
A=1
B=2
[CATEGORY_2]
C=3
D=4
E=5
...
[CATEGORY_N]
Z=26
私が達成したいのは、与えられたカテゴリ内でテキストを検索することです。
したがって、私が指定した場合は、[CATEGORY_1]
出力を提供したいと思います。
A=1
B=2
私はフラグを使用して改行文字をヌルバイト文字として解釈し、次の正規表現を使用してgrep
これを実行しようとしました。z
(^\[.*]) # Match the category
((.*\n*)+? # Match the category content in a non-greedy way
(?=\[|$)) # Lookahead to the start of other category or end of line
^
最初に式を削除しないと機能しません。しかし、これは緩い括弧のペアをカテゴリとして誤って解釈します。
これを正しく実行する方法はありますか?そうでない場合やgrep
他のツールを使用してください。sed
awk
ベストアンサー1
tomlq
TOMLjq
ラッパーの使用を検討することができます。yqプロジェクトname
、単に構文を使用してjq
カテゴリの内容を検索できます。.name
前任者。与えられた:
$ cat file.toml
[CATEGORY_1]
A=1
B=2
[CATEGORY_2]
C=3
D=4
E=5
[CATEGORY_N]
Z=26
それから
$ tomlq -t '.CATEGORY_1' file.toml
A = 1
B = 2
...コマンドラインに指定された部分名を使用します。
$ tomlq -t --arg section 'CATEGORY_1' '.[$section]' file.toml
A = 1
B = 2
出力はTOML形式です。タブ区切りの出力が必要ですか?
$ tomlq -r --arg section 'CATEGORY_1' '.[$section] | to_entries[] | [ .key, .value ] | @tsv' file.toml
A 1
B 2
@csv
代わりにCSV出力を得るために使用してください@tsv
。
元のgrepソリューションを要求したので、次のようになりますpcregrep
。
$ pcregrep -Mo '(?s)\[CATEGORY_1\]\n\K.*?(?=\n+\[)' file.toml
A=1
B=2
ここでは、複数の行を一致させるために(?s)
使用されます。あなた.
\n
.*?
できる-z
次のフラグを使用して、PCREモードでGNU grepを使用して偽にします。
$ grep -Pzo '(?s)\[CATEGORY_1\]\n\K.*?\n(?=\n+\[)' file.toml
A=1
B=2
長さが固定されているので、対称性を好む場合は、正面図と一致するように\[CATEGORY_1\]\n\K
背面図に置き換えることができます。(?<=\[CATEGORY_1\]\n)
(?=\n+\[)