【问题标题】:Regular Expression symbol "?" not working in shell正则表达式符号“?”不在外壳中工作
【发布时间】:2018-01-24 10:04:49
【问题描述】:

我有一个包含以下数据的文件。我使用egrep 作为命令 用于扩展正则表达式模式

test
best
+see
done++
feett
ttesingt

我想要如下输出

best
+see
done++
vino+

我正在使用以下命令进行输出

egrep 't?' filename.

我们知道? 的含义是0 次或一次出现previous 特点。所以在我的情况下,t 是可选的,如果它只有一个 t,但我 正在获取所有行作为输出。

请告诉我如何实现所需的输出。

【问题讨论】:

    标签: linux


    【解决方案1】:

    ? 表示:前一项是可选的,最多匹配一次。

    在您的问题中,egrep 't?' filename 的意思是,您将其视为可选权利。

    同时egrep '?' filename(这里t是零出现),所以它会打印总文件输出。

    例子:如果你给egrep 'tt?' filename,这意味着这里的第一个字符是't',下一个字符't?'是可选的零出现。所以输出将是

    egrep 't' filename

    【讨论】:

    • 感谢您的回复。那我可以知道't*'和t有什么区别吗?两者都是对的
    • @iamarunk - 两者都有?和 * 不相等 [示例:t* 表示出现零次或多次,?表示至少匹配一次] 正则表达式后面可以跟几个重复运算符之一: ?前一项是可选的,最多匹配一次。 * 前一项将匹配零次或多次。 + 前一项将被匹配一次或多次。
    【解决方案2】:

    简而言之,egrep 't?' filename 本质上的意思是“给我找一个 't' 字符,但如果它不存在,那也没关系”。


    让我们从egrep 't' 开始,这要求找到一个t 字符。它不会只说一个字符,所以会匹配“at”、“att”、“attt”等。

    然后你添加“?”对它——egrep 't?',使“t”可选,现在它匹配“a”、“at”、“att”、“abc”、“xyz”以及基本上任何其他你能想象到的字符串。

    在单字符搜索的情况下,“?”修饰符实际上没有任何意义,只有当有更多要查找时,例如匹配“abc”、“acd”但不匹配“abb”的egrep 'ab?c'


    如何让您的示例发挥作用?

    一个简单的方法就是将两个 egrep 链接在一起:

    egrep t filename | egrep -v tt
    

    第一个 egrep 只为您提供至少包含一个 t 的行,第二个将丢弃所有包含两个(或更多)t 字符的行。

    使用正则表达式的更复杂的解决方案如下所示:

    egrep '^((^|[^t]+)t($|[^t]+))+$' filename
    

    我个人更喜欢第一个:)

    【讨论】:

    • 感谢您的回复 t* 和 t 有什么区别?我的情况是两者都提供相同的输出
    • 对于单字符搜索,两者都是没有意义的——“找到我零个或一个 t”和“找到我零个或多个 t”将匹配所有内容。但是,如果您添加一些上下文,您会看到不同之处。 at?c 将仅匹配 "ac" 和 "atc",而 at*c 将匹配 "ac"、"atc"、"attc"、"attt....tttc" 等等。如果您删除“c”字符,at?at* 的行为相同,因为 egrep 搜索 子字符串,除非您使用 ^$ 锚定搜索(开始和行尾),并且“atttt”显然在其内部包含一个“at”子字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多