Bash 转换 sed 的路径名,以便它们转义

Bash 转换 sed 的路径名,以便它们转义

我的脚本有问题。它的目的是更改调用的文件中的值,%DIR%使其成为路径名。问题是目录名中的斜杠扰乱了 sed,所以我得到了奇怪的错误。我需要将路径名中的斜杠转换为转义斜杠。

所以/var/www会变成\/var\/www

但我不知道该怎么做。

目前脚本运行 sed 的方式如下:

sed -i "s/%DIR%/$directory/g" "$config"

答案1

既然你说你正在使用 Bash,那么你可以使用参数扩展插入斜杠:

$ directory=/var/www
$ echo "${directory//\//\\/}"
\/var\/www

这分解为

  • 代替directory
  • 替换每个 ( //)
  • 斜杠 ( \/)
  • 和 (/
  • 反斜杠+斜杠 ( \\/)。

将其放入 sed 命令中会得到:

sed -i "s/%DIR%/${directory//\//\\/}/g" "$config"

答案2

这里的其他答案已经很好了,但我只是想补充一点,除了/with 之外,您还可以使用不同的分隔符sed。每当我需要对包含以下内容的输入进行操作时,我都会这样做/

sed -i "s@%DIR%@${directory}@g" "$config"

甚至:

sed -i "s#%DIR%#${directory}#g" "$config"

都一样sed;它将使用您在 后面指定的任何字符s作为分隔符。

答案3

使用参数扩展/替换:

${directory////\\/}

解释

${directory // / / \\/}
            ^  ^ ^  ^
            |  | |  |
            |  | |  replacement, backslash needs to be backslashed
            |  | delimiter
            |  string
        global
      substitution

答案4

您可以使用 bash 提供的字符串操作功能参数扩展,特别是形式。请记住,这并不是唯一需要替换的字符:在替换中,字符、、换行符和分隔符都需要以反斜杠作为前缀。${VARIABLE//PATTERN/REPLACEMENT}/s\&s

replacement=$directory
replacement=${replacement//\\/\\\\}
replacement=${replacement//\//\\/}
replacement=${replacement//&/\\&}
replacement=${replacement//$'\n'/\\$'\n'}
sed -i "s/%DIR%/$replacement/g" -- "$config"

或者,使用不需要此类引用的工具,例如 awk 或 Perl。

directory=$directory awk '{gsub(/%DIR%/, ENVIRON["directory"])} 1' <"$config" >"$config.new" &&
mv -- "$config.new" "$config"

或者

directory=$directory perl -i -pe 's/%DIR%/$ENV{directory}/g' "$config"

相关内容