매우 긴 JSON 데이터 줄이 포함된 텍스트 파일이 있는데 특정 필드의 값을 추출해야 합니다. 가장 쉬운 방법은 jq
or 을 사용하는 것이라는 것을 알고 있습니다 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 호환 정규식