linux Bash脚本查找字符串并将其替换为包含复杂特殊字符的变量,而无需转义?[duplicate]

3vpjnl9f  于 2022-11-22  发布在  Linux
关注(0)|答案(1)|浏览(126)

此问题在此处已有答案

Escape a string for a sed replace pattern(17个答案)
12天前关闭。
有没有一种更简单的方法可以用包含所有复杂字符的变量替换字符串,而不需要进行字符转义?

complex='~`!@#$%^&*()-_=+\|]}{[;:/?.>,<\/*&\#/'
sed -i "s/secret\ =\ \".*/secret\ =\ \"$complex\"/g" ./file.txt

我已经知道&\/是问题所在。我可以使用sed命令进行各种清理,但有没有更简单的方法?有没有方法可以让sed按原样读取该变量?
我现在的工作如下,但即使这样也不能正确地与/一起工作...

complex='~`!@#$%^&*()-_=+\|]}{[;:/?.>,<\/*&\#/'
psk_bs="$(echo $complex | sed 's/\\/\\\\\\/g')"
psk_bs_amp="$(echo "$psk_bs" | sed 's/\&/\\&/g')"
psk_bs_amp_fs="$(echo "$psk_bs_amp" | sed 's,'/','\/',g')"
sed -i "s/secret\ =\ \".*/secret\ =\ \"$psk_bs_amp_fs\"/g" ./file.txt
k4emjkb1

k4emjkb11#

我可以用sed命令进行各种清理,但有没有更简单的方法?有没有方法可以让sed直接读取变量?
恐怕没有。但是字符转义并不像你说的那么严重。这样就可以了:

psk=$(sed 's/[/&\]/\\&/g' <<< $complex)
sed -i "s/secret = \".*/secret = \"$psk\"/g" ./file.txt

有了bash 5.2,您甚至不需要sed来进行转义:

psk=${complex//[\/&\\]/\\&}

相关问题