2014-08-30 95 views
1

有没有办法指定我要附加到我的文件的正则表达式组? 在下面的例子中,我只想要存储(\d{8})在我的文件:Grep第一组正则表达式

grep -P1 -o kamilla(\d{8}) >> whatever.txt 
+0

圆括号是模式的一部分还是他们试图捕获组? – 2014-08-30 20:32:49

+0

@TomFenech这是一个组 – Dynamiite 2014-08-30 20:35:18

+0

好吧,所以你的输入看起来像“kamilla”后跟8位数字,你想捕获的数字。 – 2014-08-30 20:35:57

回答

3

您需要使用积极Lookbehind断言或替代,以便它不包含在比赛中。

正回顾后

grep -Poi '(?<=kamilla)\d{8}' 

的向后看断言在字符串中的当前位置,什么是之前“kamilla”。如果断言成功,则正则表达式引擎会匹配八位数字。

替代\K转义序列:

grep -Poi 'kamilla\K\d{8}' 

\K转义序列重置报道比赛的起点。任何先前匹配的字符都不包含在最终的匹配序列中。

  • -o选项仅显示匹配模式的匹配部分。
+0

有\ K的替代方案吗? – Dynamiite 2014-08-30 20:43:31

+0

我试图将输出保存在文本文件中,但它也存储文件名。示例:file1:31231213 – Dynamiite 2014-08-30 20:54:46

+0

我正在搜索文件夹中的所有文件,并试图将输出保存到新文件中。示例grep -po1 [regexp] * >> hello.txt – Dynamiite 2014-08-30 20:58:43

3

可以使用-o开关和\K,从而消除了比赛的前一部分:

$ grep -Poi 'kamilla\K\d{8}' <<<"kamilla83222237" 
83222237 

正如你'使用Perl风格的正则表达式,您也可以使用Perl:

$ perl -nE 'say $1 if /kamilla(\d{8})/' <<<"kamilla83222237" 
83222237 
+1

我不确定'-1'开关的方式是什么...... – 2014-08-30 20:40:28

+0

使用'-o' - 什么都没有。它与'-C 1'相同 - 打印前一行和后一行以提供更多上下文。 – 2014-08-30 20:52:53

+0

谢谢,我从我的答案中删除了它。 – 2014-08-30 20:54:06

0

的另一种方法:

$ grep -P -o '(?<=kamilla)\d{8}' <<< kamilla12345678 
12345678 
0

可以使用sed代替:

sed -E "s/.*kamilla(\d{8}).*/\1/g" input.txt >> output.txt 

这与第一匹配组\1替换输入线和打印。

这也允许你操纵输入文件是一些不平凡的方法。例如,您可以匹配两个组并以非默认顺序输出它们,例如\2\1等等。