2012-10-03 67 views

回答

2

單程GNU sed因爲\b匹配字邊界是一個擴展。

echo "X's Score 1725 and Y's Score 6248 in the match number 576" | sed -e ' 
    ## Surround searched numbers (preceded by "Score") with newline characters. 
    s/\bScore \([0-9]\+\)\b/\n\1\n/g; 
    ## Delete all numbers not preceded by a newline character. 
    s/\([^\n0-9]\)[0-9]\+/\1/g; 
    ## Remove all other characters but numbers and newlines. 
    s/[^0-9\n]\+//g; 
    ## Remove extra newlines. 
    s/\n\([0-9]\)/\1/g; 
    s/\n$// 
' infile 

它產生:

1725 
6248 
+0

我不只是想要任何數字,但數字後跟關鍵字分數,甚至我不知道有多少模式可以在那裏輸入 – user1419742

+0

@ user1419742:已更新。 – Birei

3

你可以嘗試下面的sed命令

#!/bin/sed f 
s/Score\s*/\ 
/g 
s/\n\([0-9]\+\)[^\n]*/\ 
\1/g 
s/^[^\n]*\n// 

第一個命令repl使用換行符對所有「Score」進行加註,所以現在所有的數字都在一行的開頭。要插入一個換行符,我們必須寫一個反斜槓,後跟一個實際的換行符。這就是爲什麼命令產生兩行。

第二個命令將刪除行首的數字後的所有內容。它將匹配一個換行符,後跟一個數字(這是我們現在如何將這個數字加上「Score」字符串作爲前綴)。該號碼將被捕獲到變量\1中。然後它會跳過所有字符直到換行符。在編寫替代品時,我們必須將換行符和被捕獲的編號恢復到\1

因爲第一行包含第一個「Score」之前的文本,所以我們必須刪除它。這就是最後一條命令的作用,它從模式空間的內容開始(即我們的工作緩衝區)開始,匹配到第一個換行符的所有字符。

在單命令:

sed -e 's/Score\s*/\ 
/g;s/\n\([0-9]\+\)[^\n]*/\ 
\1/g;s/^[^\n]*\n//' 

希望這有助於=)使用

+0

我只是不想後面的關鍵字得分任何號碼,但號碼,甚至我不知道有多少模式可以在輸入 – user1419742

0

,你可以和兩個egreps:

<infile egrep -o 'Score [0-9]+' | egrep -o '[0-9]+$'