Regex 何时转义shell中的特殊字符

Regex 何时转义shell中的特殊字符,regex,linux,shell,sed,Regex,Linux,Shell,Sed,伙计们: 对于我来说,很难判断何时转义shell中的特殊字符,以及应该转义哪个字符。例如: sed '/[0-9]\{3\}/d' filename.txt 就像上面所说的,为什么我们应该逃避而保持不变,我认为他们都是特别的角色。 你能帮我吗 /br 阮我认为你的问题与正则表达式中的特殊字符有关。请查看以下内容: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03 此行为的差异

伙计们:
对于我来说,很难判断何时转义shell中的特殊字符,以及应该转义哪个字符。例如:

sed '/[0-9]\{3\}/d' filename.txt  
就像上面所说的,为什么我们应该逃避而保持不变,我认为他们都是特别的角色。
你能帮我吗

/br

我认为你的问题与正则表达式中的特殊字符有关。请查看以下内容:

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

此行为的差异仅与
sed
有关

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

sed '/[0-9]\{3\}/d'
在扩展正则表达式模式下,
[和{
都不需要转义:

sed -r '/[0-9]{3}/d'
或在OSX上:

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

[和]
在常规和扩展正则表达式模式中都被视为字符类(甚至shell的glob模式也支持它)

一般的答案是,当您想将具有特殊含义的字符视为文字字符时,需要对其进行转义,而不是因为其特殊含义。对于具有特殊含义的字符的规则因程序而异


您的具体问题涉及对
sed
具有特殊意义的字符;单引号可防止
bash
解释任何包含的字符

在此情况下,您正在逃避<代码> {<代码> > <代码> } /代码>,以防止<代码> SED>代码>解释它们。首先,请考虑此命令:

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

593
3296
但不是

34a7
因为一行中没有3位数字

现在,考虑你的命令:

sed '/[0-9]\{3\}/d' filename.txt
[0-9]
仍然是一个与单个数字匹配的正则表达式。但是现在,您已经转义了大括号。与其作为前面正则表达式的修饰符,
sed
将其视为文字字符
{
3
}
。因此它将匹配如下行:

0{3}
1{3}
5{3}
但不是像这样的线条

346

因为没有大括号。

它主要取决于sed版本(posix兼容或扩展行为),然后您需要根据shell进行调整,因为实际上,在收到sed操作之前会发生一些修改,如您所述。最好的例子是在shell级别使用simple of double quote和
\(
在sed级别)。 因此:

  • 定义所需的模式(reg ex)
  • 适应您正在使用的sed版本/选项
  • 适用于贝壳解释

  • 让我们用
    &/$IFS
    (文字,而不是IFS值)创建
    \{
    的替换sed顺序在BASH/KSH shell和posix或GNU-sed中使用双引号包围sed脚本。

    标题是shell,但问题是sed。你能澄清一下吗?问题是shell在将参数传递给sed之前是如何解析/标记命令行的。@anubhava,我认为[和{都是BASH shell中的关键字,但为什么只在这里{需要转义取决于您的sed版本和/或选项。您的
    \{3\}
    在符合posix的版本中接受3项,其中GNU sed似乎做了相反的行为