【发布时间】:2019-09-18 02:42:48
【问题描述】:
我正在尝试使用 sed 命令查找和替换特定的文本内容,并通过 shell 脚本运行它。
以下是我正在使用的示例脚本:
fp=/asd/filename.txt
fd="sed -i -E 's ($2).* $2:$3 g' ${fp}"
eval $fd
并通过传递参数执行相同的操作:
./test.sh update asd asdfgh
但如果参数字符串包含 $ ,它会破坏命令并替换为错误的值,例如
./test.sh update asd $apr1$HnIF6bOt$9m3NzAwr.aG1Yp.t.bpIS1.
如何确保变量内的值不会因为$ 而被扩展?
更新
sh 文件 test.sh
set -xv
fp="/asd/filename.txt"
sed -iE "s/(${2//'$'/'\$'}).*/${2//'$'/'\$'}:${3//'$'/'\$'}/g" "$fp"
文本文件filename.txt
hello:world
输出
1) ./test.sh 更新你好世界
sed -iE "s/(${2//'$'/'\$'}).*/${2//'$'/'\$'}:${3//'$'/'\$'}/g" "$fp"
++ sed -iE 's/(hello).*/hello:WORLD/g' /asd/filename.txt
2) ./test.sh 更新你好'$apr1$hosgaxyv$D0KXp5dCyZ2BUYCS9BmHu1'
sed -iE "s/(${2//'$'/'\$'}).*/${2//'$'/'\$'}:${3//'$'/'\$'}/g" "$fp"
++ sed -iE 's/(hello).*/hello:'\''$'\''apr1'\''$'\''hosgaxyv'\''$'\''D0KXp5dCyZ2BUYCS9BmHu1/g' /asd/filename.txt
在这两种情况下,它都不会替换内容
【问题讨论】:
-
你为什么需要
eval? -
@BenjaminW。我认为这是执行动态命令的方式。到目前为止还没有使用脚本。而且我什至不知道它的基础知识。所以我全神贯注
-
filename.txt是什么样的,为什么它不只是一个您可以获取的函数定义文件,以便您可以调用适当的函数而不是使用eval?跨度> -
@chepner 这是带有用户名和加密密码的 htpassword 文件
-
对不起,我看错了作业;我以为你试图将
sed的 result 作为命令执行。