Bash 脚本中的 SED:如何用来自 Bash 脚本变量的特殊字符替换文本

Bash 脚本中的 SED:如何用来自 Bash 脚本变量的特殊字符替换文本

首先,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 -cfind命令中使用以下方法来将密码作为变量:

 var1='var\&2018+\&'
 find . -name "list.txt" -exec bash -c 'sed -i "s/1234/$2/g" $1' _ {} "$var1" \;

答案2

它可能有助于您理解您必须知道的问题,这&是一个代表正则表达式的整个匹配的特殊字符。

由于1234找到了,因此您将它替换为var12342018+1234,两者&成为匹配的字符串。

我想说的另一点实际上是个人喜好,但使用find ... -execwith {},我不喜欢这种语法,我通常以它结尾\;

我更喜欢使用 xargs

find . -name list.txt | xargs sed -i 's/1234/var&2018+&/g'

注意结尾的 g 会多次替换它......

这也可能很明显..我不知道list.txt你的子树中有多少个文件,但如果只有一个,则不需要find

sed -i 's/pattern/replacement/options' filename

相关内容