2017-10-24 4 views
0

파일의 일부 텍스트를 바꾸고 파일 끝 부분에 몇 줄을 추가해야합니다.텍스트 바꾸기 및 추가 텍스트 삽입

나는이 있습니다

{ 
    "something": "option1", 
    "other": [ 
    "value", 
    ] 
} 

을하고 나는이 필요합니다

{ 
    "something": "option2", 
    "other": [ 
    "value", 
    ], 
    "more": { 
    "stuff": "yey!" 
    } 
} 

내가이 scipt 시도 :

stuff=$1 

value=", 
    \"more\": { 
    \"stuff\": \"$stuff\" 
    }" 

sed -e "s/option1/option2" -e '$ \i$value' \ 
    file1.json > file2.json 

을하지만 난 얻을 :

{ 
    "something": "option2", 
    "other": [ 
    "value", 
    ] 
$value 
} 

어떻게하면 제대로 할 수 있습니까?

+0

작은 따옴표는 변수를 확장하지 않는 리터럴 문자열입니다. –

+0

@Austin_Anderson 나는이 결과를 얻는 이유를 알고 있지만,이 경우 변수를 확장하는 방법을 모르겠다 ... 나는 여러 가지 시도를했다. 그러나 이것은 오류를 던지지 않는 유일한 것이다 (; – Sasxa

+0

또한 정규식은 json을 구문 분석 할 수 없으므로 하나 이상의 구문이 필요하면 perl이나 python 스크립트처럼 json 라이브러리를 사용해야합니다. –

답변

1

json 데이터를 조작하는 유일한 방법은 JSON 파서/프로세서를 사용하는 것입니다. 기간!

유효한 JSON file1.json :

{ 
    "something": "option1", 
    "other": [ 
    "value" 
    ] 
} 

stuff="jq got you" 
jq --arg stuff "$stuff" '.more = {stuff: $stuff}' file1.json 

출력 :

사용 jq 프로세서, 그것은 JSON 쉽고 편안과의 "관계"를 만들어 줄게

{ 
    "something": "option1", 
    "other": [ 
    "value" 
    ], 
    "more": { 
    "stuff": "jq got you" 
    } 
} 
당신이 나오지와 함께 원하는 경우
0

더 좋은 방법이 있지만, 당신은 GNU와

echo "$value" | sed ':A;/\n.*}/!{N;bA};h;s/.*//;N;$!{s/.*\n//;:B;N;$!{H;s/option1/option2/;s/\n.*//p;g;s/\(.*\)\(\n.*\n[^\n]*\)/\1/;x;s/\(.*\n\)\([^\n]*\)/\2/;bB}};H;g;s/\(.*\n\)\([^\n]*\)\(\n[^\n]*\)/\2/;G;s/\(.*\n\)\([^\n]*\n\)\([^\n]*\)/\1\3/;s/\([^\n]\)\(\n\)\(.*\)/\1\3/' /dev/stdin infile 

을 나오지 또는 오픈 BSD와

cat scriptsed 
sed ':A;/\n.*}/!{N;bA 
} 
h;s/.*//;N;$!{s/.*\n//;:B;N;$!{H;s/option1/option2/;s/\n.*//p;g;s/\(.*\)\(\n.*\n[^\n]*\)/\1/;x;s/\(.*\n\)\([^\n]*\)/\2/;bB 
} 
} 
H;g;s/\(.*\n\)\([^\n]*\)\(\n[^\n]*\)/\2/;G;s/\(.*\n\)\([^\n]*\n\)\([^\n]*\)/\1\3/;s/\([^\n]\)\(\n\)\(.*\)/\1\3/' 

를 나오지도 시도 할 수 아니에요 그리고

과 같이 호출
(echo "$value";cat infile) | ./scriptsed