2013-05-10 253 views
2

說的字符串提取子:使用正則表達式,而排除了某些特定的詞組

test.1234.mp4 

我想提取數字沒有MP4

提取4會是什麼樣的正則表達式是爲了這個嗎?

這些數字並不總是處於第二位,並且可能位於不同的位置,可能並不總是四位數。我想提取的數字,而不是基本上提取mp4中的4。

更多的例子:

test.abc.1234.mp4 
test.456.abc.mp4 
test.aaa.bbb.c.111.mp4 
test.e666.123.mp4 

基本上僅數字將被提取。因此,對於最後一個例子,666從E666不會extracte只有123 要我一直在使用

echo "example.123.mp4" | grep -o "REGEX" 

編輯解壓:test456本來是test.456

+0

所以,你想要所有的*只是*號的塊包圍點?在'test456.abc.mp4'中,你會抽出一些東西嗎? – fedorqui 2013-05-10 08:42:33

+0

第二個:test456.abc.mp4? – Vijay 2013-05-10 08:44:30

回答

5

接受的答案將在「test.e666.123.mp4」(打印666)上失敗。

這應該工作

$ cat | perl -ne '/\.(\d+)\./; print "$1\n"' 
test.abc.1234.mp4 
test.456.abc.mp4 
test.aaa.bbb.c.111.mp4 
test.e666.123.mp4 
1234 
456 
111 
123 

注意,這將只打印數字的第一組中,如果我們只有123將被打印test.123.456.mp4。

這個想法是匹配一個點,然後是我們感興趣的數字(括號來保存匹配),然後是另一個點。這意味着它將在123.mp4上失敗。

爲了解決這個問題,你可以有:

$ cat | perl -ne '/(^|\.)(\d+)\./; print "$2\n"' 
test.abc.1234.mp4 
test.456.abc.mp4 
test.aaa.bbb.c.111.mp4 
test.e666.123.mp4 
781.test.mp4 
1234 
456 
111 
123 
781 

首場比賽是線(^)或點的任意開始,後面數字和一個點。我們在這裏使用$ 2,因爲$ 1是一行或一個點的開始。

5

cut可以使它:

$ echo "test.1234.mp4" | cut -d. -f2 
1234 

其中

cut -d'.'  -f2 
     delimiter 2nd field 

如果您提供莫重新舉例說明我們可以改進輸出。使用當前代碼,您可以提取blablabla.something.blablabla中的任何something


更新:從你的問題更新,我們可以做到這一點:

grep -o '\.[0-9]*\.' | sed 's/\.//g' 

測試:

$ echo "test.abc.1234.mp4 
test456.abc.mp4 
test.aaa.bbb.c.111.mp4 
test.e666.123.mp4" | grep -o '\.[0-9]*\.' | sed 's/\.//g' 
1234 
111 
123 
+0

問題在於「數字並不總是處於第二位」,但您的解決方案是否會採取其他措施。 – Alper 2013-05-10 08:40:04

+0

是的,這就是爲什麼我指出*如果您提供更多示例,我們可以提高輸出*。 – fedorqui 2013-05-10 08:41:11

+1

我想你使用的例子。作爲分隔符相當不錯。不正是我所尋找的,因爲我不知道perl直到出現其中一個答案。但是,這將是解決我的問題的創造性/聰明的方式。 – SamIAm 2013-05-10 08:55:32

1
grep -Po "(?<=\.)\d+(?=\.)" 
0
perl -F'\.' -lane 'print "$F[scalar(@F)-2]" if(/\d+\.mp4$/)' your_file 

測試:

> perl -F'\.' -lane 'print "$F[scalar(@F)-2]" if(/\d+\.mp4$/)' temp 
1234 
111 
123 
1
echo "test.1234.mp4" | perl -lpe 's/[^.\d]+\d*//g;s/\D*(\d+).*/$1/' 

或:

echo "1321.test.mp4" | perl -lpe 's/.*(?:^|\.)(\d+)\..*/$1/' 

p是默認打印,這樣我們不需要明確printe說,我們有一個表現,而不是一個腳本文件 l把換行符

這些,如果你有一些在名稱的第一部分也可以工作。

+0

-lpe在這裏代表什麼? – SamIAm 2013-05-10 09:00:59

+1

我喜歡單線的想法,但我認爲最好添加對所用參數的解釋。總而言之,SO中的想法不僅僅是爲了回答,而是爲了使OP更加獨立於編碼。 – fedorqui 2013-05-10 09:07:13

0
$ cat file 
test.abc.1234.mp4 
test.456.abc.mp4 
test.aaa.bbb.c.111.mp4 
test.e666.123.mp4 

$ sed 's/.*\.\([0-9][0-9]*\)\..*/\1/' file 
1234 
456 
111 
123 
相關問題