首先,bash 脚本中有一个包含特殊字符的变量。这是示例。list.txt:
user = root
password = 1234
Bash脚本:
#!/bin/sh
var1 = var&2018+&
find . -name "list.txt" -exec sed -i "s/1234/"$var1"/g" {} +
当我执行脚本时,结果是:var12342018+1234。
更新 1 (Oliv 的回答):
var1='var&2018+&'
find . -name "*list.txt" -exec bash -c 'sed -i "s/1234/$2/g" $1' _ {} "$var1" \;
结果仍然是:密码=var12342018+1234
也许有人可以帮助我。谢谢
答案1
首先,您需要引用您的var1
变量。
您可以bash -c
在find
命令中使用以下方法来将密码作为变量:
var1='var\&2018+\&'
find . -name "list.txt" -exec bash -c 'sed -i "s/1234/$2/g" $1' _ {} "$var1" \;
答案2
它可能有助于您理解您必须知道的问题,这&
是一个代表正则表达式的整个匹配的特殊字符。
由于1234
找到了,因此您将它替换为var12342018+1234
,两者&
成为匹配的字符串。
我想说的另一点实际上是个人喜好,但使用find ... -exec
with {}
,我不喜欢这种语法,我通常以它结尾\;
我更喜欢使用 xargs
find . -name list.txt | xargs sed -i 's/1234/var&2018+&/g'
注意结尾的 g 会多次替换它......
这也可能很明显..我不知道list.txt
你的子树中有多少个文件,但如果只有一个,则不需要find
。
sed -i 's/pattern/replacement/options' filename