我想更换一个变量扩展与一个网址--- 直接在文件内。
我想要替换变量扩展的 URL 是 UTF-8 编码的,因为其网页名称的语言是从右到左 (RTL) [希伯来语]。
这是我使用的替换替换模式(目前没有转义):
sed -i 's/$contact_form_success_webpage/https://example.com/index.php?title=%D7%99%D7%A6%D7%99%D7%A8%D7%AA_%D7%A7%D7%A9%D7%A8:%D7%94%D7%A6%D7%9C%D7%97%D7%94/g' FILE
$
我可以在of之前添加一个反斜杠,$contact_form_success_webpage
使其\$contact_form_success_webpage
可以通过以下方式处理,sed
但是开始向“长”编码 URL 的需要转义的部分添加反斜杠是我不想完全由自己做的事情,并且更喜欢为此进行一些自动化。
上面的 URL 模式相当“轻”或“简单”,但某些 URL 可能有很多正斜杠 ( /
),也许还有很多其他需要转义的部分。
您建议如何转义 UTF-8 编码的 URL?
(对于一般所有用例,您将使用什么模式?)
答案1
一种方法是在 bash 中绑定一个函数,当给定一个可插入到 sed 命令 s/// 的 LHS 或 RHS 的字符串时,如下所示:
esc_sedvar() {
case $1 in
'--lhs')
a=( '\' "[" "^" '$' "." "*" / ) ;;
'--rhs'|*)
a=( '\' '&' / )
esac
local var=$2
for c in "${a[@]}"; do
var=${var//"$c"/\\"$c"}
done
printf '%s\n' "$var"
}
### don't escape anything in this, for you they are plain strings.
srch='$contact_form_success_webpage/https://example.com'
repl='index.php?title=%D7%99%D7%A6%D7%99%D7%A8%D7%AA_%D7%A7%D7%A9%D7%A8:%D7%94%D7%A6%D7%9C%D7%97%D7%94'
sed -i -e \
's/'\
"$(esc_sedvar --lhs "$srch")"\
'/'\
"$(esc_sedvar --rhs "$repl")"\
'/g'\
FILE