문자열을 교체하다

문자열을 교체하다

다음 형식의 문자열이 있습니다.

"User-Password":"aaaa","Calling-Station-Id":"bbbb","Eltex-AVPair":"cccc","h323-call-type":"dddd","Framed-IP-Address":"eeee","NAS-IP-Address":"ffff","Cisco-AVPair":["xpgk-request-type=gggg","xpgk-src-number-in=hhhh","xpgk-dst-number-in=iiii","xpgk-src-number-out=jjjj","xpgk-dst-number-out=kkkk","h323-gw-address=llll"],"Acct-Session-Id":"mmmm","User-Name":"nnnn","Called-Station-Id":"oooo","h323-gw-id":"pppp","Event-Timestamp":"qqqq","h323-conf-id":"rrrr","h323-call-origin":"ssss","NAS-Port-Type":"tttt","NAS-Port":"uuuu"

로 변환해야 해요

User-Password = "aaaa"
Calling-Station-Id = "bbbb"
Eltex-AVPair = "cccc"
h323-call-type = "dddd"
Framed-IP-Address = "eeee"
NAS-IP-Address = "ffff"
Cisco-AVPair = "xpgk-request-type=gggg"
Cisco-AVPair = "xpgk-src-number-in=hhhh"
Cisco-AVPair = "xpgk-dst-number-in=iiii"
Cisco-AVPair = "xpgk-src-number-out=jjjj"
Cisco-AVPair = "xpgk-dst-number-out=kkkk"
Cisco-AVPair = "h323-gw-address=llll"
Acct-Session-Id = "mmmm"
User-Name = "nnnn"
Called-Station-Id = "oooo"
h323-gw-id = "pppp"
Event-Timestamp = "qqqq"
h323-conf-id = "rrrr"
h323-call-origin = "ssss"
NAS-Port-Type = "tttt"
NAS-Port = "uuuu"

vim을 사용하세요.

그래서 이렇게되어야합니다

:s/\,/\r/g|:s/^\"//g|(something_for_copying_Cisco-AVPair)|:s/\"\:/\ \=\ /g 

이는 네 부분으로 나누어져 있습니다:

  1. ,를 \r로 변환
  2. 삭제^"
  3. Cisco-AVPair를 복사하고 대괄호를 제거합니다.
  4. '":'을 '='로 변환

이 대체 항목의 첫 부분과 마지막 부분만 쓸 수 있습니다. 다른 사람들과 어떻게 지내야 할까요?

답변1

일련의 검색/대체를 수행할 수 있습니다.

:%s/,/\r/g
:%s/^"
:v/:/s/^/Cisco-AVPair":"
:%s/\v":\[?"/ \= "

이것은 다음과 같이 번역됩니다.

  1. ,각각을 개행 문자로 바꾸십시오 .
  2. 모든 선행 따옴표 제거
  3. 줄 시작 바꾸기아니요:다음을 포함합니다Cisco-AVPair":"
  4. 모두 ":["다음으로 교체= "

답변2

이 작업에 대한 다음 솔루션을 찾았습니다.

echo '' | jq -r 'paths(scalars) as $p|[([$p[]|tostring ]|join(".->.") ),(getpath($p)|tojson)]|join(" = ")'|grep '^RAD_REQUEST\.\-'|sed -r 's/^[A-Z_]+\.\->\.//'|sed -r 's/\.\->\.[0-9]+//'

작동하려면 따옴표 사이에 요청을 입력해야 합니다.

답변3

JSON 문서(문제를 해결하기 위해 수정되어 더 이상 유효한 JSON 문서가 아님)를 TOML로 변환하는 것 같습니다. 표시되는 TOML은 다음과 같습니다.상당히중복된 키가 포함되어 있으므로 유효합니다.

원래 JSON 객체가 다음과 같다고 가정합니다.

{
  "User-Password": "aaaa",
  "Calling-Station-Id": "bbbb",
  "Eltex-AVPair": "cccc",
  "h323-call-type": "dddd",
  "Framed-IP-Address": "eeee",
  "NAS-IP-Address": "ffff",
  "Cisco-AVPair": [
    "xpgk-request-type=gggg",
    "xpgk-src-number-in=hhhh",
    "xpgk-dst-number-in=iiii",
    "xpgk-src-number-out=jjjj",
    "xpgk-dst-number-out=kkkk",
    "h323-gw-address=llll"
  ],
  "Acct-Session-Id": "mmmm",
  "User-Name": "nnnn",
  "Called-Station-Id": "oooo",
  "h323-gw-id": "pppp",
  "Event-Timestamp": "qqqq",
  "h323-conf-id": "rrrr",
  "h323-call-origin": "ssss",
  "NAS-Port-Type": "tttt",
  "NAS-Port": "uuuu"
}

yq다음과 같은 다양한 도구를 사용하여 TOML로 변환할 수 있습니다.https://kislyuk.github.io/yq/또는 yj에서https://github.com/sclevine/yj.

그리고 yq,

yq -t . file

또는 yj,

yj -jt <file

두 경우 모두 결과 TOML 문서는 다음과 같습니다.

User-Password = "aaaa"
Calling-Station-Id = "bbbb"
Eltex-AVPair = "cccc"
h323-call-type = "dddd"
Framed-IP-Address = "eeee"
NAS-IP-Address = "ffff"
Cisco-AVPair = [ "xpgk-request-type=gggg", "xpgk-src-number-in=hhhh", "xpgk-dst-number-in=iiii", "xpgk-src-number-out=jjjj", "xpgk-dst-number-out=kkkk", "h323-gw-address=llll",]
Acct-Session-Id = "mmmm"
User-Name = "nnnn"
Called-Station-Id = "oooo"
h323-gw-id = "pppp"
Event-Timestamp = "qqqq"
h323-conf-id = "rrrr"
h323-call-origin = "ssss"
NAS-Port-Type = "tttt"
NAS-Port = "uuuu"

관련 정보