2つの文字列間の複数のテキストインスタンスの抽出

2つの文字列間の複数のテキストインスタンスの抽出

Spotifyチャートの結果を含むテキストファイルから2つの文字列の間のテキストを抽出したいと思います。

テキストファイルの抽出:

{"tracks":[{"date":"2014-12-14","country":"TW","track_url":"https:\/\/play.spotify.com\/track\/34gCuhDGsG4bRPIf9bb02f","track_name":"Thinking Out Loud","artist_name":"Ed Sheeran","artist_url":"https:\/\/play.spotify.com\/artist\/6eUKZXaKkcviH0Ku9w2n3V","album_name":"x","album_url":"https:\/\/play.spotify.com\/album\/1xn54DMo2qIqBuMqHtUsFd","artwork_url":"http:\/\/o.scdn.co\/300\/646e9619750dfa3d1eadbbea959dc6f528a9109e","num_streams":51672,"window_type":"weekly","percent_male":58,"percent_age_group_0_17":4,"percent_age_group_18_24":45,"percent_age_group_25_29":25,"percent_age_group_30_34":12,"percent_age_group_35_44":7,"percent_age_group_45_54":1,"percent_age_group_55_plus":6},

抽出するテキストはトラック名です。上記のテキストファイルの目的の出力:

1 Thinking Out Loud
2 xxx
3 xxx

sedこれを達成するために、コマンドを使用してnl文字列間のテキストを抽出したいと思います。

"track_name":"       and
   ",

...結果を別のテキストファイルに出力します。

答え1

GNU grepがあれば、Perl準拠の正規表現を使うことができます。これはLookaroundアサーションのおかげで便利です。

grep -oP '(?<=track_name).*?(?=,)' filename

答え2

以下は、入力した入力と一致し、必要な出力を提供するサンプル正規表現です。この方法では、sedに各行で検索+置換を実行させ、行にtrack_nameとカンマが含まれている場合は、行全体を中間部分に置き換えます。次に、一致する行(p)のみを印刷します。

[me:~]$ cat work/tmp/example.txt 
{"tracks":[{"date":"2014-12-14","country":"TW","track_url":"https:\/\/play.spotify.com\/track\/34gCuhDGsG4bRPIf9bb02f","track_name":"Thinking Out Loud","artist_name":"Ed Sheeran","artist_url":"https:\/\/play.spotify.com\/artist\/6eUKZXaKkcviH0Ku9w2n3V","album_name":"x","album_url":"https:\/\/play.spotify.com\/album\/1xn54DMo2qIqBuMqHtUsFd","artwork_url":"http:\/\/o.scdn.co\/300\/646e9619750dfa3d1eadbbea959dc6f528a9109e","num_streams":51672,"window_type":"weekly","percent_male":58,"percent_age_group_0_17":4,"percent_age_group_18_24":45,"percent_age_group_25_29":25,"percent_age_group_30_34":12,"percent_age_group_35_44":7,"percent_age_group_45_54":1,"percent_age_group_55_plus":6},
[me:~]$ sed -n 's/.*track_name":"\(.*\)","artist_name.*/\1/p' work/tmp/example.txt | nl
     1  Thinking Out Loud

例として表示するために、この出力をファイルにリダイレクトすることを省略しました。> file.txtファイル書き込み用の追加の標準出力リダイレクトです。

つまり、「artist_name」の前にある「track_name」に依存し、その文字列のどれも行の他の場所にはありません。これはGNU Sedで動作します。

最終的に、これは仕事に適したツールではないかもしれません。すでに明示的にフォーマットされた(json)テキストがあるため、jsonを解析できるツールを使用する方がより信頼性が高いでしょう。 sed のさまざまなバージョンはさまざまな正規表現拡張をサポートできるため、結果はプラットフォームによって異なる場合があります。

関連情報