Linux sed 명령은 정규식을 사용하여 공백과 특수 문자가 포함된 두 줄을 바꿉니다.

Linux sed 명령은 정규식을 사용하여 공백과 특수 문자가 포함된 두 줄을 바꿉니다.

다음 샘플 텍스트가 포함된 파일이 있습니다.

"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 $ 

관련 정보