アイテムの多いファイルがあります。特定のコンポーネントの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.inst
printのみのabcd.inst
解決策は正規表現を使用して出力全体をキャプチャすることです。grep -oP 'abcd.inst[^"]+'
やりたいことをします。この-P
フラグはPerlスタイルモードを有効にし、次の引用符と一致するようにモードを変更しました。これはリンクですパターンが何をするかを正確に説明するツールです。
答え2
文書がJSON文書の場合は、JSONパーサーを使用して解析する必要があります。id
文書内のキーが見つかる場所を知らず、これを行うのは厄介ですが、可能です。以下は、値が文字列で始まる場合、jq
文書全体のすべてのキーからすべての値を抽出するために使用されます。id
abcd.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
出力されます。