2015-01-09 83 views
0

我有一個文件「fruit.xml」看起來像下面:sed命令脫光匹配發現

FRUIT="Apples" 
FRUIT="Bananas" 
FRUIT="Peaches" 

我想用一個SED行命令查找的NAME="所有出現,我想剝離發現的所有匹配中的""之間的值。

所以結果應該是這樣的:

Apples 
Bananas 
Peaches 

這是我使用的命令:

sed 's/.*FRUIT="//' fruit.xml 

的問題是,它留下的最後"在我需要的值的末尾。例如:Apples"

+0

是否每個「值」或多個'FRUIT =「Peaches」可能出現在文件中只有1次出現? – NeronLeVelu

+0

可能有幾次FRUIT =「Peaches」 – FireHawk2300

+0

這樣幾乎沒有任何提議的解決方案可以工作,因爲它們不會處理多次發生,而只是爲了移除周圍的信息'(FRUIT +「'和last'」'這樣一個'| sort -u'是要添加到所有回覆我猜 – NeronLeVelu

回答

5

正好趕上小組和打印回:捕獲一切從"直到另一個"找到具有()(或\(...\)如果你不使用-r選項)。然後,打印回來\1

$ sed -r 's/.*FRUIT="([^"]*)"/\1/' file 
Apples 
Bananas 
Peaches 

您還可以使用字段分隔符與awk:告訴awk你的字段分隔符要麼或"。這樣,所需的內容就成爲第二個領域。

$ awk -FS='FRUIT="|"' '{print $2}' file 
Apples 
Bananas 
Peaches 

爲了使您的指揮工作,只是剝離"在該行的末尾:

$ sed -e 's/.*FRUIT="//' -e 's/"$//' file 
     ^^     ^^^^^^^^^^^ 
     |     replace " in the end of line with nothing 
     -e to allow you use multiple commands 
+1

命題:'[^「]'可以替換爲'。'在這種情況下(對於'FRUIT =「''''''和'=」'相同),沒有任何其他特定約束,並且基於樣本 – NeronLeVelu

+1

或者多個命令:'sed's /.* FRUIT =「//; s /」 $ //'' – jm666

+0

是的,這兩個建議都相當有幫助!我是upvoting的意見,讓你是獲得學分:) – fedorqui

1

,如果你想保持領先的空間這將是足夠的,

sed 's/\bFRUIT="\([^"]*\)"/\1/' fruit.xml 

sed 's/\bFRUIT="\|"//g' fruit.xml 
0

試試這個,這取代了引號與創辦果行:

sed 's/.*FRUIT="\(.*\)"/\1/' test.xml 
+0

使用「fruits.xml」作爲課程的文件名;-) – Biber

0

用一個簡單的cut命令

cut -d '"' -f2 fruits.xml 

輸出:

Apples 
Bananas 
Peaches 
0

假設1個occurence每個值和這種格式

sed 's/.*="//;s/".*$//' fruit.xml