使用 sed 将每个空格替换为反斜杠

使用 sed 将每个空格替换为反斜杠

只想转义 Windows 文件路径中的空格。我正在尝试这样做:

echo "111  1111 "| sed -e "s/[[:space:]]/\\ /g"

仅匹配空格但不替换。

答案1

如果使用双引号,bash则会解释\\并输出\,然后再次从sed与以下空格一起解释为仅空格。

因此,您还需要一个反斜杠:

echo "111  1111 " | sed -e "s/[[:space:]]/\\\ /g"

但最好使用单引号来防止 bash 解释:

echo "111  1111 " | sed -e 's/[[:space:]]/\\ /g'

输出:

111\ \ 1111\ 

替代方法:

如果您将文件路径作为变量,则可以使用 Shell 方法:

path="111  1111 "
echo ${path// /\\ }

答案2

[[:space:]]不只是匹配空格,而是所有空白字符包括制表符和换行符。如果你真的想要,GNU (比如在 Ubuntu 中)有它的sed简写类:\s

sed 's_\s_\\&_g'

这将用反斜杠 ( ) 和其本身s替换每行中的每个 ( g) 空格字符(\s,匹配嵌入在模式/保留空格中的空格、制表符和换行符)\\-&即整个匹配模式。我使用不同的分隔符,因为斜杠和反斜杠放在一起总是看起来令人困惑;s/\s/\\&/g当然也是有效的。

如果你只想替换空间字符,而是使用:

sed 's_ _\\&_g'

示例运行

$ echo "111  1111 " | sed 's_ _\\&_g'
111\ \ 1111\ 

有关字符类别的进一步阅读,请参阅这里是regular-expressions.info

相关内容