Grep第一组正则表达式

时间:2014-08-30 20:29:50

标签: regex bash vim

有没有办法指定我想要附加到我的文件的regexp组? 在下面的示例中,我只想将(\d{8})存储在我的文件中:

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

4 个答案:

答案 0 :(得分:4)

您需要使用正面观察断言或替代方案,以使其不包含在匹配中。

积极向后看

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

后视断言,在字符串中的当前位置,先前的是&#34; kamilla&#34;。如果断言成功,则正则表达式引擎匹配八位数。

替代\K转义序列:

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

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

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

答案 1 :(得分:3)

您可以使用-o开关和\K,它会移除匹配的前一部分:

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

当您使用Perl风格的正则表达式时,您也可以使用Perl:

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

答案 2 :(得分:0)

另一种方式:

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

答案 3 :(得分:0)

您可以改为使用sed

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

这是用第一个匹配的组\1替换输入行并打印它。

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