한 줄의 텍스트에서 정규식 다음에 오는 문자열을 찾는 방법은 무엇입니까?

한 줄의 텍스트에서 정규식 다음에 오는 문자열을 찾는 방법은 무엇입니까?

매우 긴 JSON 데이터 줄이 포함된 텍스트 파일이 있는데 특정 필드의 값을 추출해야 합니다. 가장 쉬운 방법은 jqor 을 사용하는 것이라는 것을 알고 있습니다 grep -o. 그러나 회사 컴퓨터에 있으므로 설치할 수 없으며 jq우리가 사용하는 Solaris 버전에는 grep해당 옵션이 없습니다 -o. 현재 다음 명령을 사용하고 있습니다.

cat json.file   |
    tr "," "\n" |
    awk '/customfield_10701/ { print $0 }' |
    tr '"' "\n" |
    awk 'NR==4'

위의 방법은 잘 작동하지만 지나치게 복잡하고 더 우아한 솔루션이 있어야 한다는 느낌을 지울 수 없습니다.

json.file:

... jshdgfjhsdgfjh,"customfield_10701":"Some Branch","customfield_10702ksghdkfsdkfjkj ...

현재 명령으로 다음을 얻습니다.

Some Branch

(그것이 내가 원하는 것입니다).

답변1

찾고 있는 데이터에 문자가 없다고 확신하고 "파일에 "customfield_10701" 항목이 포함된 줄이 하나만 있는 경우

sed -n 's/.*"customfield_10701":"\([^"]*\)".*/\1/p'

예를 들어,

$ cat x
... jshdgfjhsdgfjh,"customfield_10701":"Some Branch","customfield_10702ksghdkfsdkfjkj ...
$ sed -n 's/.*"customfield_10701":"\([^"]*\)".*/\1/p' x
Some Branch

답변2

쉼표를 개행 문자로 변환하는 데 사용할 필요가 없습니다 tr. 그런 다음 다시 돌아 왔습니다. awk입력 레코드 구분 기호( )로 쉼표를 사용할 수 있습니다 RS.

awk -F':' -v RS=',' '/customfield_10701/ { gsub(/"/,"",$2); print $2 }' json.file

gsub()"필드 2에서 큰따옴표(있는 경우)를 제거하는 데 사용됩니다 .

gsub()필요한 경우 다음을 사용하여 선행 및 후행 공백과 탭을 제거 할 수도 있습니다 .

awk -F':' -v RS=',' '/customfield_10701/ {
    gsub(/"|^[[:blank:]]+|[[:blank:]]+$/,"",$2);
    print $2
}' json.file

RS가 변경되면 출력 레코드 구분 기호( ORS)는 자동으로 변경되지 않으며, 설정하지 않는 한(예: 를 사용하여 -v ORS=',') 기본값(개행)으로 유지됩니다.

답변3

다음 테스트는 나에게 효과적이었습니다.bash 3 내장 정규식 엔진외부 프로그램도 필요하지 않습니다.

json='"jshdgfjhsdgfjh,"customfield_10701":"Some Branch","customfield_10702ksghdkfsdkfjkj"'

regex_hint=customfield_10701

[[ $json =~ $regex_hint\":\"(.+)\", ]] && printf '%s\n' "${BASH_REMATCH[1]}" 

인쇄:일부 지점

'( )' 사이의 정규 표현식은 "그룹 1 캡처"이며 "${BASH_REMATCH"에 저장됩니다.1}"

Bash에는 지원 기능이 내장되어 있습니다.POSIX 확장 정규식많이 알려진 것보다는Perl 호환 정규식

관련 정보