同じ2行のテキストの間にある複数のテキストインスタンスを抽出します。

同じ2行のテキストの間にある複数のテキストインスタンスを抽出します。

私のファイルはJSON形式で、次のようになります。

name: Tom species: mouse name: Stu species: cat name: Carter species: Dog

長い文字列ファイルがありますが、このリストから名前を抽出したいと思います。したがって、希望の出力は次のようになります。

Tom Stu Carter

たとえば、sedを使用して何度も失敗しようとしました。

cat alphabet | sed 's/^.*name: \(.*\) species*/\1/g'

出力:

Tom species: mouse name: Stu species: cat name: Carter : Dog

これを実行したい非常に大きなファイルがたくさんあるので、この問題を解決するための効率的な方法があれば良いでしょう。

答え1

入力が実際にJSONの場合は、JSONツールを使用する必要があります。

形式はawkに適しているようです。

$ awk '{for (i=2;i<=NF;i++) if ($(i-1)=="name:") print $i}' file
Tom
Stu
Carter

i2番目のフィールドから始めて、行のすべてのフィールドを調べます。前のフィールドがそうであれば、name:現在のフィールドが印刷されます。

すべての出力を1行に保持するには(末尾の空白なし):

$ awk '{for (i=2;i<=NF;i++) if ($(i-1)=="name:") {printf "%s%s", f,$i; f=" "}; print""}' file
Tom Stu Carter

答え2

GNU grepを使用してください:

grep -Po 'name: \K[^ ]*' file | tr '\n' ' '

またはGNU sedを使用してください。

sed -r 's/name: ([^ ]*) species: [^ ]*/\1/g' file

出力:

トム・シチュー・カーター

関連情報