特定のカテゴリタイトルから次のカテゴリタイトルまで、テキストファイルからテキストを抽出します。

特定のカテゴリタイトルから次のカテゴリタイトルまで、テキストファイルからテキストを抽出します。

次の形式の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他のツールを使用してください。sedawk

ベストアンサー1

tomlqTOMLjqラッパーの使用を検討することができます。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+\[)

おすすめ記事