【发布时间】:2013-09-16 13:20:49
【问题描述】:
这个网站上有很多关于如何为 sed 转义各种元素的问题,但我正在寻找更一般的答案。我知道我可能想转义一些字符以避免外壳扩展:
Bash:
- 单引号 [strings] ('') 用于保留引号内每个字符的字面值。 [然而,]
单引号不能出现在单引号之间,即使前面有反斜杠。- 只有在后面跟着 dollar、反引号、双引号时,反斜杠才 [在双引号字符串中] strong>、反斜杠或换行符。在双引号内,反斜杠后跟这些字符之一时,将从输入流中删除。反斜杠前面没有特殊含义的字符不会被 shell 解释器处理。
sh:(希望你没有历史扩展)
- 单引号字符串行为:与 bash 相同
- 用双引号括起来的字符会保留字面值 引号内的所有字符,dollar、单引号、反斜杠和除外, 启用历史扩展时,感叹号。
- 字符
dollar和单引号在双引号中保留其特殊含义。- 反斜杠仅在后跟以下字符之一时才保留其特殊含义:
$、'、"、\或换行符。 双引号可以在双引号内引用 引号前加反斜杠。- 如果启用,将执行历史扩展,除非出现在双引号中的 感叹号 使用反斜杠转义。 ! 前面的反斜杠没有被移除。
...但这些都不能解释为什么一旦您删除任何转义,它就会停止工作:
sed -e "s#\(\w\+\) #\1\/#g" #find a sequence of characters in a line
# why? ↑ ↑ ↑ ↑ #replace the following space with a slash.
(、)、/ 或 +(或 [,或 ]...)似乎没有任何特殊含义需要转义才能工作.见鬼,即使直接通过 Python 调用命令也会使 sed 无法正常工作,尽管联机帮助页似乎没有详细说明这一点(无论如何,当我搜索反斜杠时也没有。)
$ lvdisplay -C --noheadings -o vg_name,name > test
$ python
>>> import os
>>> #Python requires backslash escaping of \1, even in triple quotes
>>> #lest \1 is read to mean "byte with value 0x01".
>>> output = os.execl("/bin/sed", "-e", "s#(\w+) #\\1/#g", "test")
(Output remains unchanged)
$ python
>>> import os
>>> output = os.execl("/bin/sed", "-e", "s#\(\w\+\) #\\1\/#g", "test")
(Correct output)
$ WHAT THE HELL
Have you tried using jQuery? It's perfect and it does all the things.
【问题讨论】: