转义 UTF-8 编码的 URL

转义 UTF-8 编码的 URL

我想更换一个变量扩展与一个网址--- 直接在文件内。
我想要替换变量扩展的 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

相关内容