저는 이 sed 명령을 사용하여 MyKey와 같은 키의 json 값을 추출합니다.
sedPattern='s/^.*"myKey":"\([^"]*\)".*$/\1/'
이와 같은 json 문자열의 경우
{"myKey" : 1, "yourKey": 2}
내가 필요한 것을 반환합니다.
1
그러나 \1
위 sed 명령의 작업은 무엇을 의미합니까?
답변1
\([^"]*\)
실제로 두 개의 중괄호() 사이에 있는 문자 집합을 정의하므로 중괄호를 \(
이스케이프 해야 합니다.\)
\1
첫 번째 그룹의 내용입니다.
여러 그룹은 여러 중괄호 쌍 세트를 사용하여 정의할 수 있으며 증분적으로 번호가 지정되고 각 그룹은 \n
(예 \1
: , \2
등 \3
)로 참조될 수 있으므로 이름은 다음과 같습니다.역참조.
답변2
\1
\(...\)
캡처된 부분 문자열의 첫 번째 집합(즉, 표현식의 첫 번째 집합)에 대한 역참조입니다. 중첩된 그룹이 있는 경우 첫 번째 그룹은 \(
표현식의 가장 왼쪽 그룹입니다.
귀하의 예에서는 문자열의 특정 위치에 있는 하위 문자열입니다 [^"]*
(큰따옴표가 없는 빈 문자열일 수 있음).
JSON을 구문 분석하는 더 좋고 안전한 방법은 다음과 같은 JSON 인식 도구를 사용하는 것입니다 jq
.
jq -r '.myKey' document.json
이를 통해 구조화된 언어를 사용하여 데이터를 추출할 수 있을 뿐만 아니라 추출한 데이터가 JSON으로 인코딩될 수 있도록 보장합니다.
sed
네 표정을 알아차렸어별말씀을요1
문서를 다음과 같이 다시 작성하지 않는 한 지정된 JSON 문서에서 추출합니다 .
{"myKey":"1","yourKey":2}
이 문서는 두 가지 면에서 다릅니다.
키와 값 사이의 공백이 다릅니다. 이는 JSON 파서에는 중요하지 않지만 JSON 구조를 이해하지 못하는 라인 기반 도구에는 중요합니다.
이제 키 값 유형이
myKey
숫자가 아닌 문자열입니다. 이는 파서가 값을 처리하는 방법에 따라 중요합니다. 값으로 변환해야 할 수도 있고예상되는문자열이 됩니다. 이는 데이터를 사용하는 애플리케이션에 따라 다릅니다.
또한 문서는 다음과 같습니다.동일한도착하다
{
"myKey": "1",
"yourKey": 2
}
JSON 파서는 둘 사이의 차이점을 볼 수 없지만 sed
한 문서에서는 무언가를 추출할 수 있지만 다른 문서에서는 추출하지 못할 수도 있습니다.