sed 명령 대체 쓰기

sed 명령 대체 쓰기

여러 줄이 포함된 파일에서 다음 문자열을 다른 문자열로 바꾸려고 합니다.

"schema" : "AAAAA",

도착하다

"schema" : "BBBBB",

현재 "스키마"를 사용하여 해당 행을 가져오기 위해 다음 명령을 실행하고 있습니다.

현재 아키텍처 =cat test.json | grep schema | awk {'print $3'}

그러면 "AAAAAA"라는 값이 표시됩니다.

AAAAA를 BBBBB로 바꾸고 싶습니다

다음 명령을 사용했습니다.

sed -e 's/$currentSchema/BBBBB/p' test.json

단, 동일한 파일 내에서는 교체할 수 없습니다.

답변1

JSON 파일 예:

[
  {
    "host": "myhost",
    "schema": "AAAAA",
    "lunch": "sandwich"
  },
  {
    "host": "myotherhost",
    "schema": "QQQQQ",
    "lunch": "pizza"
  }
]

우리는 각각을 다음과 같이 바꾸고 싶습니다 schema.AAAAABBBBBjq

$ jq 'map(if .schema == "AAAAA" then .schema = "BBBBB" else . end)' file.json
[
  {
    "host": "myhost",
    "schema": "BBBBB",
    "lunch": "sandwhich"
  },
  {
    "host": "myotherhost",
    "schema": "QQQQQ",
    "lunch": "pizza"
  }
]

다음과 같은 경우 이전 스키마가 무엇인지는 중요하지 않습니다.

$ jq 'map(.schema = "BBBBB")' file.json
[
  {
    "host": "myhost",
    "schema": "BBBBB",
    "lunch": "sandwhich"
  },
  {
    "host": "myotherhost",
    "schema": "BBBBB",
    "lunch": "pizza"
  }
]

이는 적절한 JSON 파서 이므로 jq파일이 더 컴팩트한 형식(예: 한 줄)으로 렌더링되는 경우에도 작동합니다.

[{"host":"myhost","schema":"AAAAA","lunch":"sandwhich"},{"host":"myotherhost","schema":"QQQQQ","lunch":"pizza"}]

~을 위한실제질문(댓글에서), 즉 값이 포함된 키가 있는 요소를 찾아 .rules.behavior[]해당 .name요소 를 다른 값으로 mPulse변경합니다 ..options.apiKey

jq '.rules.behaviors = [.rules.behaviors[]|select(.name == "mPulse").options.apiKey = "XXX"]' file.json

즉, 키가 있는 요소가 새 요소를 가져오는 .rules.behaviour방식으로 배열을 다시 작성합니다 ..namemPulse.options.apiKey

답변2

일부 최적화 중 가장 중요한 것은 "쓸모없는 사용 cat"을 피하는 것입니다. cat file | grep pattern그럴 필요는 없습니다 grep pattern file. grepping 을 원하므로 awk다음과 같이 단순화할 수도 있습니다.

currentSchema="$( cat test.json | grep schema | awk '{print $3}' )"

~이 되다

currentSchema="$( awk '/schema/ {print $3}' test.json )"

이제 sed스크립트를 작성하세요. 당신은 사용하고 있습니다강한 인용( ')를 sed 명령 주위에 추가하면 쉘 변수가 구문 분석되지 않음을 의미합니다. 당신은 사용해야합니다약한 인용문( ") 이렇게 하려면 다음을 수행합니다.

currentSchema="$( awk '/schema/ {print $3}' test.json )"
sed --in-place "s/$currentSchema/BBBBB/" test.json

답변3

grep, , 가 필요하지 않으며 awk이를 위해 모든 작업이 완료됩니다(테스트되지 않음).sedawk

awk '/schema/ {$3 = "BBBBB"} 1' test.json > /tmp/$$ && mv /tmp/$$ test.json

시도해보고 다시 보고해 주세요.

관련 정보