두 문자열 사이에 있는 여러 텍스트 인스턴스 추출

두 문자열 사이에 있는 여러 텍스트 인스턴스 추출

Spotify 차트 결과가 포함된 텍스트 파일에서 두 문자열 사이의 텍스트를 추출하고 싶습니다.

텍스트 파일 추출:

{"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의 다양한 버전은 다양한 정규식 확장을 지원할 수 있으므로 결과는 플랫폼마다 다를 수 있습니다.

관련 정보