Sed 中变量内的双引号

Sed 中变量内的双引号

更新

感谢@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会导致打印所有行,无论是否修改。

相关内容