有沒有辦法指定我要附加到我的文件的正則表達式組? 在下面的例子中,我只想要存儲(\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