동일한 두 줄의 텍스트 사이에 있는 여러 텍스트 인스턴스를 추출합니다.

동일한 두 줄의 텍스트 사이에 있는 여러 텍스트 인스턴스를 추출합니다.

내 파일은 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

i두 번째 필드부터 시작하여 행의 모든 ​​필드를 살펴봅니다 . 이전 필드가 그랬다면 name:현재 필드가 인쇄됩니다.

모든 출력을 한 줄에 유지하려면(후행 공백 없음):

$ 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

산출:

톰 스튜 카터

관련 정보