고쳐 쓰다
@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
인해 모든 행이 인쇄되거나 수정되거나 되지 않습니다.