这个网站上有很多关于如何为 sed 转义各种元素的问题,但我正在寻找一个更一般的答案。我知道我可能想转义一些字符以避免外壳扩展:
重击:
- 单引号 [strings] ('') 用于保留引号内每个字符的文字值。[然而,]
单引号之间可能不会出现单引号,即使前面有反斜杠也是如此。- 反斜杠仅在后跟美元、反引号、双引号、反斜杠或换行符时才保留其含义 [在双引号字符串中] 。在双引号内,反斜杠后跟这些字符之一时,将从输入流中删除。没有特殊含义的字符前面的反斜杠不作修改,以供 shell 解释器处理。
sh:(我希望你没有历史扩展)
- 单引号字符串行为:与 bash 相同
- 用双引号括起来的字符会保留引号内所有字符的字面值,但美元、单引号、反斜杠以及启用历史扩展时的感叹号除外。
- 字符
dollar
和单引号在双引号中保留其特殊含义。- 反斜杠仅在后跟以下字符之一时才保留其特殊含义:
$
、'
、"
、\
或换行符。双引号可以用反斜杠在双引号中引用。- 如果启用,除非使用反斜杠转义出现在双引号中的感叹号,否则将执行历史扩展。! 前面的反斜杠 没有被删除。
...但是这些都不能解释为什么一旦您删除任何转义,它就会停止工作:
sed -e "s#\(\w\+\) #\1\/#g" #find a sequence of characters in a line
# why? ↑ ↑ ↑ ↑ #replace the following space with a slash.
(
, )
, /
or +
(or [
, or ...) 似乎没有]
任何特殊含义需要它们被转义才能工作。地狱,即使直接通过 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.