有没有办法指定我要附加到我的文件的正则表达式组? 在下面的例子中,我只想要存储(\d{8})
在我的文件:Grep第一组正则表达式
grep -P1 -o kamilla(\d{8}) >> whatever.txt
有没有办法指定我要附加到我的文件的正则表达式组? 在下面的例子中,我只想要存储(\d{8})
在我的文件:Grep第一组正则表达式
grep -P1 -o kamilla(\d{8}) >> whatever.txt
您需要使用积极Lookbehind断言或替代,以便它不包含在比赛中。
正回顾后:
grep -Poi '(?<=kamilla)\d{8}'
的向后看断言在字符串中的当前位置,什么是之前“kamilla”。如果断言成功,则正则表达式引擎会匹配八位数字。
替代\K
转义序列:
grep -Poi 'kamilla\K\d{8}'
的\K
转义序列重置报道比赛的起点。任何先前匹配的字符都不包含在最终的匹配序列中。
-o
选项仅显示匹配模式的匹配部分。可以使用-o
开关和\K
,从而消除了比赛的前一部分:
$ grep -Poi 'kamilla\K\d{8}' <<<"kamilla83222237"
83222237
正如你'使用Perl风格的正则表达式,您也可以使用Perl:
$ perl -nE 'say $1 if /kamilla(\d{8})/' <<<"kamilla83222237"
83222237
我不确定'-1'开关的方式是什么...... – 2014-08-30 20:40:28
使用'-o' - 什么都没有。它与'-C 1'相同 - 打印前一行和后一行以提供更多上下文。 – 2014-08-30 20:52:53
谢谢,我从我的答案中删除了它。 – 2014-08-30 20:54:06
的另一种方法:
$ grep -P -o '(?<=kamilla)\d{8}' <<< kamilla12345678
12345678
可以使用sed
代替:
sed -E "s/.*kamilla(\d{8}).*/\1/g" input.txt >> output.txt
这与第一匹配组\1
替换输入线和打印。
这也允许你操纵输入文件是一些不平凡的方法。例如,您可以匹配两个组并以非默认顺序输出它们,例如\2\1
等等。
圆括号是模式的一部分还是他们试图捕获组? – 2014-08-30 20:32:49
@TomFenech这是一个组 – Dynamiite 2014-08-30 20:35:18
好吧,所以你的输入看起来像“kamilla”后跟8位数字,你想捕获的数字。 – 2014-08-30 20:35:57