2012-12-07 13 views
3

我是bash的新手,並且很難搞清楚這一點。SED:如何在一個給定的文件中使用sed只能找到偶數

使用sed,任何人都可以幫助我找到給定的文件中只有偶數?

我想出如何找到[0,2,4,6,8]使用此開始的所有數字:

sed -n 's/^[0-9]*[02468] /&/w even' <file 

但是,這並不能保證數量是偶數肯定的。

我很難找到匹配的數字是否以[0,2,4,6,8]結尾,因爲它是可以肯定的。

那麼,任何人都可以幫助我嗎?

回答

1

你的正則表達式看起來有點怪異,我不知道你想做的事,但這應該幫助:

sed -r -n 's/^[0-9]*?[02468] /even/g' 

-r啓用擴展正則表達式,*?使它非貪婪,和/g到爲文件中的所有行全局執行替換。

+0

首先我想你可能會把'perl'和'sed'混淆,據我所知'sed'沒有這樣的''非貪婪'的操作符。其次,如果您調用了'-n',則不會打印任何內容,因爲替代命令中不存在'p'標誌。最後,目前還不清楚,但我相信@ user445687希望將那些以偶數或數字本身開頭的行寫入名爲'even'的文件。 – potong

0

爲什麼你找不到以[0248]結尾的數字?

1

你的命令應該正常工作假設有一個空格後都爲偶數時,他們都在行的開頭:

$ echo 'foo 
1231 
2220 
1254 ' | sed -n '/[0-9]*[02468] /p' 
2220 
1254 

還要注意的是,因爲你實際上並不做替代,您不需要s命令。使用地址(模式)說明符和w命令(就像我上面用p命令所做的那樣)。

爲了確保即使數字是最後一個,但不一定後跟一個空格,你可以這樣做

$ echo 'foo 
1231 
2220 
1254 ' | sed -n '/[0-9]*[02468]\($\|[^0-9]\)/p' 
2220 
1254 

其實,你的情況看起來更像是一個用例grep,不sed,因爲你做了過濾而不是編輯。一切都變得與GNU grep更容易,因爲你可以做

$ echo 'foo 
1231 
2220 
1254 ' | grep -P '\d*[02468](?!\d)' 
2220 
1254 

只是追加> even的命令,使其寫入文件even

1
$ cat file 
1 
2 
3 
498 
57 
12345678 
$ awk '$0%2' file 
1 
3 
57 
$ awk '!($0%2)' file 
2 
498 
12345678