【问题标题】:Bash - replace escaped charactersBash - 替换转义字符
【发布时间】:2017-07-03 08:52:27
【问题描述】:

我必须用它们的转义版本替换变量中的所有斜线、反斜线、单引号和双引号,可能在传递中:

' --> \'
" --> \"
\ --> \\
/ --> \/

此时,我用这个来代替单引号:

${MYVAR//\'/\\\'}

但是当我尝试一次性替换斜杠、反斜杠、单引号和双引号时,我被卡住了。

【问题讨论】:

  • 如果您尝试转义字符串以用作 shell 输入,您可以尝试 printf '%q' "$MYVAR"(如果您的 bash 支持)。
  • 它用于 Synology NAS 脚本:我必须使用 PHP 引擎通过邮件从 bash 发送变量的值。当然,PHP 会返回带有嵌套引号的错误。

标签: bash escaping


【解决方案1】:

您可以使用 sed 替换:

echo "'\"\\/" | sed "s~\(['\"\/]\)~\\\\\1~g"

根据cmets编辑:

EXPLORE_FOLDER="/volume1/video/myMovies"
LS_LIST="$(ls --recursive "$EXPLORE_FOLDER")"
RESULT="$(sed "s~\(['\"\/]\)~\\\\\1~g" <<<"$LS_LIST")"
echo "$RESULT"

或者只是:

EXPLORE_FOLDER="/volume1/video/myMovies"
RESULT="$(ls --recursive "$EXPLORE_FOLDER" | sed "s~\(['\"\/]\)~\\\\\1~g" <<<"$LS_LIST")"
echo "$RESULT"

【讨论】:

  • 谢谢 Pavel,但我是个新手... MYVAR 在您的 sed 解决方案中在哪里?
  • @Zax 像这样:echo "$MYVAR" | sed ...
  • 或者,更好的是,使用herestring 来避免创建不必要的进程:sed ... &lt;&lt;&lt;"$MYVAR"
  • @will ahem...我无法让它工作。我使用:EXPLORE_FOLDER="/volume1/video/myMovies" LS_LIST=$(ls --recursive "$EXPLORE_FOLDER") sed "'\"\\/" | "s~\(['\"\/]\)~\\\\\1~g" &lt;&lt;&lt;"$LS_LIST" echo $LS_LIST(LS_LIST 必须稍后通过电子邮件发送)。
  • @Zax 我刚刚更新了我的答案以匹配您提供的示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多