我的脚本有问题。它的目的是更改调用的文件中的值,%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"