更新
感谢@steeldriver的回答,问题不在于双引号是/
我唯一需要替换的|
目前我的命令有一些问题sed
,我尝试替换文件内的字符串,问题是替换包含双引号。
变量包含文件的值:变量文本具有该值
<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
会导致打印所有行,无论是否修改。