了解grep中的大括号

时间:2014-04-29 17:01:43

标签: grep

我正在阅读Cameron NewHam的“学习打击”。在那本书中有以下几行代码 `

function lsd
{
    date=$1
    ls -l | grep -i "^.\{42\}$date" | cut -c55-
}

` 我试图在{42}了解{}的重要性。我看到反斜杠正在逃避支撑,但我发现很难理解括号在这个正则表达式中起什么作用。

3 个答案:

答案 0 :(得分:0)

在正则表达式中,表达式后面包含数字的大括号表示重复。在此正则表达式中,.\{42\}表示匹配任何字符.中的42个。

答案 1 :(得分:0)

在正则表达式中,{n}表示"匹配前一个字符"的n。在这种情况下,扩展为" ^:在字符串的开头,.:匹配任何字符,{42} 42次,$date:后跟此文字($date,即$1,即您传入lsd)"。

答案 2 :(得分:0)

我想让你困惑的是\ - >逃逸。

首先有不同的合规性,主要是:BRE(b:基本),ERE(E:扩展)和PCRE(PC:Perl兼容)

对于工具grep,默认使用BRE,这意味着,对于那些具有特殊含义的字符,例如(, ), |, {, }...,您必须将它们转义为赋予它们的特殊含义。在您的示例中为\{n\},重复上一个字符/组n次。没有逃避它们,它们只是文字字符串。

如果您使用egrep or grep -E ERE,则扮演角色。通过ERE,我们可以逃避那些具有特殊含义的字符剥夺特殊含义,这意味着\{42\} ERE意味着文字字符串"{42}"

某些grep实现具有选项-P来支持PCRE,就转义而言,PCREERE相同