繁体   English   中英

何时在外壳中转义特殊字符

[英]when to escape special character in shell

球员:
我很难判断何时在shell中转义特殊字符,以及应转义哪个字符。 例如:

sed '/[0-9]\{3\}/d' filename.txt  

像上面一样,为什么我们应该逃避{而保留[不变,我认为它们都是特殊字符。
你能帮我吗?

/ BR

此行为的差异仅与sed有关。

在常规模式下,sed仅支持非常基本的正则表达式,因此{会字面匹配,除非您注意到转义。

sed '/[0-9]\{3\}/d'

在扩展的正则表达式模式下, [ and {都不需要转义:

sed -r '/[0-9]{3}/d'

或在OSX上:

sed -E '/[0-9]{3}/d'

[ and ]在常规和扩展正则表达式模式下均被视为字符类(即使Shell的glob模式也支持它)

普遍的答案是,当您想将其视为文字字符而不是具有特殊含义时,需要转义具有特殊含义的字符。 哪些字符具有特殊含义的规则因程序而异。


您的具体问题涉及到的是有特殊含义的字符sed ; 单引号可防止bash解释任何封闭的字符。

在这种情况下,您要转义{}以防止sed解释它们。 首先,考虑以下命令:

sed '/[0-9]{3}/d' filename.txt

如果您使用的sed版本专门处理[{ ,则此命令说删除所有包含正好3位数的序列的行。 [0-9]不是字面意义上的5个字符的字符串。 它是匹配任何单个数字的正则表达式。 {3}不是字面上的3个字符的字符串; 它是一个与前面的正则表达式完全匹配的修饰符。 将匹配以下行:

593
3296

但不是

34a7

因为连续没有3位数字。

现在,考虑您的命令:

sed '/[0-9]\{3\}/d' filename.txt

[0-9]仍然是匹配单个数字的正则表达式。 但是现在,您已经摆脱了大括号。 sed不是将其用作前面的正则表达式的修饰符,而是将其视为文字字符{3} 因此它将匹配以下行:

0{3}
1{3}
5{3}

但不是像

346

因为没有括号。

我认为您的问题与正则表达式中的特殊字符有关。 看一下这个:

http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03

它主要取决于sed版本(与posix兼容或扩展的行为),然后您需要根据shell进行调整,因为,确实,在像您声明的那样接收sed操作之前会进行一些修改。 最好的例子是在shell级别使用简单的双引号,在sed级别使用\\((因此。

  1. 定义所需的模式(reg ex)
  2. 适应您使用的sed版本/选项
  3. 适应外壳解释

让我们在BASH / KSH shell和posix或GNU sed中使用双引号括起来的sed脚本,用&/$IFS (文字,不是IFS值)创建\\{的替换sed顺序很有趣。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM