2014-08-30 92 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等等。