다음 샘플 텍스트가 포함된 파일이 있습니다.
"list-value": {
"object-value": {
"value": "example-value-123"
}
}
목록 값의 패턴을 값 텍스트 "example-value-changed-567"과 일치시켜 값 텍스트 "example-value-123"을 변경하고 싶습니다.
예
"list-value": {
"object-value": {
"value": "example-value-changed-567"
}
}
값으로 시작하는 텍스트 패턴을 일치시키고 싶지 않습니다. 목록 값부터 패턴을 일치시켜야 합니다. 정규식을 만들려고 했지만 새 줄을 찾은 후 패턴을 일치시킬 수 없습니다.
지금까지 시도한 정규 표현식
$ sed -i 's/ [[:space:]]\"list-value\":[[:space:]]{[[:space:]]N;[[:space:]]\"objet-value\"[[:space:]]:[[:space:]]\"[\w+\W+]+\"[[:space:]]} / [[:space:]]\"list-value\":[[:space:]]{[[:space:]]N;[[:space:]]\"objet-value\"[[:space:]]:[[:space:]]\"example-value-changed-567\"[[:space:]]}/g' file.json
위 명령의 경우 다음 오류가 발생합니다.
sed: 1: "file. ...": command a expects \ followed by text
온라인에서 정규식을 만들었지만 sed 명령을 사용하면 작동하지 않습니다.
\s+"list-value":\s+{\s+"value"\s*:\s+"[\w+\W+]+"\s+}
sed 명령에 대해 더 좋고 효율적인 정규식을 찾아야 합니다.
답변1
JSON 문서가 다음과 같이 잘 구성되어 있다고 가정합니다.
{
"list-value": {
"object-value": {
"value": "example-value-123"
}
}
}
jq
이 값을 수정하는 데 사용할 수 있습니다.
$ jq '."list-value"."object-value".value="example-value-changed-567"' file.json
{
"list-value": {
"object-value": {
"value": "example-value-changed-567"
}
}
}
결과는 새 파일로 리디렉션될 수 있으며, 변경하려는 경우 원본 파일을 대체할 수 있습니다.
tmpfile=$(mktemp)
cp file.json "$tmpfile"
jq '."list-value"."object-value".value="example-value-changed-567"' "$tmpfile" >file.json
rm "$tmpfile"
. sed
예를 들어, 입력 데이터에 사용된 실제 형식이나 문자 인코딩은 문서와 동일합니다.
{ "list-value": {
"object-value": { "value":
"example-value-123"
}
}
}
답변2
나는 당신이 이것을 sed 명령으로 찾고 있다고 생각합니다.
sed -i.backup '/list-value/{N;N;s/example-value-123/example-value-changed-567/}' file.json
예:
$ cat ./file.json
"list-value": {
"object-value": {
"value": "example-value-123"
}
}
"list-value-2": {
"object-value": {
"value": "example-value-123"
}
}
# please note this creates a backup file: file.json.backup
$ sed -i.backup '/list-value/{N;N;s/example-value-123/example-value-changed-567/}' file.json
$ cat ./file.json
"list-value": {
"object-value": {
"value": "example-value-changed-567"
}
}
"list-value-2": {
"object-value": {
"value": "example-value-123"
}
}
답변3
중첩된 구조(예: JSON)는 구조 인식(여기에서는 JSON) 루틴으로 처리되어야 합니다. (다중)라인 인식 루틴을 통해 이를 처리하려고 할 때마다 항상 잘못된 긍정을 얻게 됩니다.
따라서 귀하의 요구 사항(다시 말하면 JSON이 적절하게 구성되었다고 가정)은 다음을 통해 쉽게 달성할 수 있습니다.jtc
:
bash $ jtc -w'[list-value]<value>l' -u'"example-value-changed-567"' file.json
{
"list-value": {
"object-value": {
"value": "example-value-changed-567"
}
}
}
bash $