Grepは単語全体を抽出します(引用符を除く)。

Grepは単語全体を抽出します(引用符を除く)。

アイテムの多いファイルがあります。特定のコンポーネントのIDを抽出したいと思います。 IDの前にabcd.inst 同じ単語を1つだけ意味します。

abcd.inst.sdt.gh-wer-1.anrg6ljrgo5rdtyc25lgtr2wf7iuhu2f5scwehpjjzerzpnphn3tzy4w2wjq

私がするたびに

cat abcd.txt | grep "abcd.inst"

私が得た結果は次のとおりです。

"id": "abcd.inst.sdt.gh-wer-1.anrg6ljrgo5rdtyc25lgtr2wf7iuhu2f5scwehpjjzerzpnphn3tzy4w2wjq"

とにかく、出力を次のようにすることは可能ですか?

abcd.inst.sdt.gh-wer-1.anrg6ljrgo5rdtyc25lgtr2wf7iuhu2f5scwehpjjzerzpnphn3tzy4w2wjq

使用して疲れました。

grep -oh abcd.inst abcd.txt

しかし、出力は

abcd.inst

答え1

grep -o一致するテキストのみを出力するので、grep -o abcd.instprintのみのabcd.inst解決策は正規表現を使用して出力全体をキャプチャすることです。grep -oP 'abcd.inst[^"]+'やりたいことをします。この-PフラグはPerlスタイルモードを有効にし、次の引用符と一致するようにモードを変更しました。これはリンクですパターンが何をするかを正確に説明するツールです。

答え2

文書がJSON文書の場合は、JSONパーサーを使用して解析する必要があります。id文書内のキーが見つかる場所を知らず、これを行うのは厄介ですが、可能です。以下は、値が文字列で始まる場合、jq文書全体のすべてのキーからすべての値を抽出するために使用されます。idabcd.inst

jq -r ' .. |
        select( type == "object" and
                has("id") and
                (.id | startswith("abcd.inst"))
        ).id' file.json

コマンドラインで探している文字列をに渡すこともできますjq

jq -r --arg string 'abcd.inst' '
        .. |
        select( type == "object" and
                has("id") and
                (.id | startswith($string))
        ).id' file.json

文書をプレーンテキストとして処理すると、それを使用してsed探している文字列を抽出できます。これは、データが質問テキストにあるのと同じで、部分文字列などの行に他のデータがないと仮定し"id":ます"abcd.inst。また、私たちが抽出する文字列には二重引用符が含まれておらず、デコードのために何らかの方法でエンコードする必要はないと仮定する必要があります。

sed     -e '/^[[:blank:]]*"id":[[:blank:]]*"abcd\.inst/!d' \
        -e 's/"[^"]*$//' \
        -e 's/.*"//' file

上記のコマンドは、ファイルから次に始まらないすべての行をsed削除します(行の先頭と指定された2つの部分文字列の間にオプションのスペースまたはタブがあります)。"id":"abcd.inst

後続の 2 つの置換は、上記のように削除していない行を切り捨てます。最初の置換は、その行の最後の二重引用符とその後のすべての内容を削除します。 2番目の置換は、行の先頭から最初の置換によって生成された行の最後の二重引用符まですべてを削除します。

これらの操作の後、私たちが探している部分文字列は行に残り、端末にsed出力されます。

関連情報