2010-10-20 58 views
4

首先,我不知道這是否實際可行,但我想要做的是重複一個正則表達式模式。 我使用的模式是:重複一個正則表達式

sed 's/[^-\t]*\t[^-\t]*\t\([^-\t]*\).*/\1/' films.txt 

250. 7.9 Shutter Island (2010) 110,675 

一個輸入將返回:

Shutter Island (2010) 

我匹配的所有無標籤,(250),那麼標籤,然後全部無選項卡(7.9),然後選項卡。接下來我回顧電影標題,然後匹配所有剩餘的字符(110,675)。

它工作正常,但即時通訊學習正則表達式,這看起來很醜陋,正則表達式[^ - \ t] * \ t在它本身之後重複,是否有重複這個像你可以像一個字符{2, 2}?

我試過([^-\t]*\t){2,2}(和變化),但我猜,嘗試匹配[^-\t]*\t\t?

此外,如果有什麼辦法讓我上面的代碼更短和更清潔的任何幫助,將不勝感激。

回答

2

我想你可能會以這種錯誤的方式去做。如果你只是想提取電影的名字,它的發行年份,那麼你可以試試這個正則表達式:

(?:\t)[\w()]+(?:\t) 

由於這裏的地方看到:

http://regexr.com?2sd3a

注意它匹配實際所需字符串開頭和結尾的製表符,但不包括匹配組中的字符。

+0

它也可能有助於解釋你想要的結果。 – 2010-10-20 16:53:36

+0

乾杯這個工作完美,謝謝你的鏈接,將幫助調試/學習更好的正則表達式 – akd5446 2010-10-20 17:06:30

+0

我喜歡這是多麼簡潔,並且在你的鏈接中看到*匹配*,但是它是如何使用的以及用什麼命令從行中提取名稱/日期?因爲它沒有一個捕獲組和替換,所以沒有看到它與'sed'一起使用它。如果你添加一個在命令中使用它的例子, oduce輸出列出文件中的名稱。 – 2010-10-20 23:48:39

2

您可以將它們放在括號中,類似這樣的事情重複:

([^-\t]*\t){2,2} 

並全面配合使用的標題是這樣的:

([^-\t]*\t){2,2}([^-\t]+).* 

你說你嘗試過。我不確定什麼是不同的,但上面的例子適合我的樣本數據。

+0

我正在嘗試自己的事情,只是用你在這裏寫的東西,它也不適合我。當你輸入'(...)'(不期望它工作)並且逃脫parens'\\(... \\)'時,我用普通的parens嘗試了,也逃脫了'\ +'......我的' sed --version'說的是'GNU sed version 4.1.5',它在RedHat Enterprise 5.1上[哦,看來,反斜槓並沒有在評論中顯示,直到我把它翻了兩倍'\\\('] – 2010-10-20 16:54:23

+0

你需要使用'sed -r'或者逃脫parens *和*大括號以便在sed中工作 – dannysauer 2016-05-29 15:42:07

2

你爲什麼要這麼做?

$ awk '{$1=$2=$NF=""}1' file 
    Shutter Island (2010) 
+1

謝謝,這也適用。將繼續學習更多的Linux。 – akd5446 2010-10-20 17:14:22

+0

假定文件是製表符分隔的:awk -F「|」 '{print $ 3,$ 4}'文件名 – galaxywatcher 2015-02-23 11:44:53

1

如果這是一個普通格式的製表符分隔的文件,我會使用的cut代替sed

cut -d' ' -f3 films.txt

注意-d後有一個單一標籤引號之間,其能在shell提示符下鍵入ctrl + v first,即ctrl+v ctrl+i

+0

電影名稱之間有空格。 – ghostdog74 2010-10-20 17:10:03

+0

謝謝你這樣做也行,會投票,但不能。 – akd5446 2010-10-20 17:12:11

+0

@ghostdog:根據OP的正則表達式,有標籤,而不是空格。 – 2010-10-20 17:20:00

5

這個工作對我來說:

sed 's/\([^\t]*\t\)\{2\}\([^\t]*\).*/\2/' films.txt 

如果您sed支持-r你可以擺脫大多數逃逸的:

sed -r 's/([^\t]*\t){2}([^\t]*).*/\2/' films.txt 

更改第一2選擇不同的領域(0- 3)。

這也將工作:

sed 's/[^\t]\+/\n&/3;s/.*\n//;s/\t.*//' films.txt 

更改3選擇不同的字段(1-4)。

3

要重複使用大括號和分組支架與sed正確,你可能有反斜槓逃脫它像

sed 's/\([^-\t]*\t\)\{3\}.*/\1/' films.txt

是,該命令將與你的榜樣正常工作。

如果你覺得很煩,你可以選擇使用-r選項,它啓用正則表達式擴展模式,並忘記括號上的反斜槓轉義。

sed -r 's/([^-\t]*\t){3}.*/\1/' films.txt

發現,這是幾乎相同的丹尼斯·威廉姆森的答案,但我要離開它,因爲它表達短做同樣的。

+0

謝謝。 pre -r選項使得有限的重複成爲可能。 – user3469861 2017-08-03 12:06:45