正则表达式符号"?"不在shell中工作

时间:2018-01-24 10:04:50

标签: linux

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

test
best
+see
done++
feett
ttesingt

我希望输出如下

best
+see
done++
vino+

我使用以下命令输出

egrep 't?' filename.

我们知道?的含义为零或前一次出现     字符。所以在我的情况下t是可选的,如果它出现它只有一个t但我     我把所有的行作为输出。

请告诉我如何获得所需的输出。

2 个答案:

答案 0 :(得分:1)

interface FormParent { forms: Form[]; } export class Form { public parent: FormParent; } 表示:前面的项目是可选的,最多匹配一次。

在您的问题中,?表示您将其视为可选权利。

同时egrep 't?' filename(此处egrep '?' filename为零),因此它将打印总文件输出。

示例:如果您提供t,则表示第一个字符为egrep 'tt?' filename,下一个字符't'为可选零值。所以输出将是

't?'

答案 1 :(得分:0)

简而言之,egrep 't?' filename本质上意味着"找到我' t'性格,但如果它不存在,那也可以"。

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

然后你添加"?"对它 - egrep 't?',制作" t"可选的,现在匹配" a"," at"," att"," abc"," xyz"基本上你可以想象的任何其他字符串。

如果是单字符搜索"?"修饰符并没有任何意义,只有在找到更多内容时,例如egrep 'ab?c'匹配" abc"," acd",但不是" abb"。

如何让您的示例正常工作?

一种简单的方法就是将两个白鹭连在一起:

egrep t filename | egrep -v tt

首先,egrep只为你提供至少包含一个t的行,第二个会将所有包含两个(或更多)t个字符的行扔掉。

使用regexp的更复杂的解决方案将如下所示:

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

我个人更喜欢第一个:)