Sed의 변수 내부에 큰따옴표가 있습니다.

Sed의 변수 내부에 큰따옴표가 있습니다.

고쳐 쓰다

@steeldriver 답변 주셔서 감사합니다. 문제는 큰따옴표 /만 교체해야 한다는 것이 아닙니다.|

현재 내 명령에 몇 가지 문제가 있습니다 sed. 파일 내부의 문자열을 바꾸려고 하는데 문제는 대체 항목에 큰따옴표가 포함되어 있다는 것입니다.

변수에는 파일의 값이 포함됩니다. 변수 text에는 해당 값이 있습니다.

<string name="app_mod_app_crowdin_1">crowdin one es</string>

문제는 명령을 실행할 때입니다.sed

  sed -i .bak -e "Ns/.*/$text/" results.txt

실수

sed: 1: "1s/.*/<string name="app ...": bad flag in substitute command: 's'

답변1

foo='"hello world"'
echo $foo
"hello world"
echo '"hello world"' | sed 's/'"$foo"'/bye hell/'
bye hell

답변2

sed사용자가 제공한 데이터를 스크립트에 삽입하지 마십시오 . 이는 가치 있는 것보다 더 큰 문제이며 많은 경우 보안 허점이 될 수도 있습니다(특히 sed임의 코드 실행을 허용하는 GNU의 경우). 삽입된 명령 $text의 교체 부분은 s///실제로 sed임의의 문자열로 스크립트를 수정 한다는 점을 명심하십시오 $text.

첫 번째 줄만 고정 문자열로 변경해야 하는 경우 대신 다음을 사용하세요 awk.

cp results.txt results.txt.bak &&
awk -v value="$text" 'NR == 1 { $0 = value }; 1' results.txt.bak >results.txt

시험:

$ text='<string name="app_mod_app_crowdin_1">crowdin one es</string>'
$ cat results.txt
line 1
line 2
line 3
$ cp results.txt results.txt.bak && awk -v value="$text" 'NR == 1 { $0 = value }; 1' results.txt.bak >results.txt
$ cat results.txt
<string name="app_mod_app_crowdin_1">crowdin one es</string>
line 2
line 3

awk코드는 단순히 현재 줄을 주어진 텍스트로 대체합니다. if NR == 1, 즉 이것이 파일의 첫 번째 줄인 경우. 후행으로 1인해 모든 행이 인쇄되거나 수정되거나 되지 않습니다.

관련 정보