2015-07-10 87 views
1

我有一個簡單的sed問題。sed:刪除數字後的數字

我的數據是這樣的:

2600,Sale,"Approved 911973",244.72 
2601,Sale,"Approved 04735C",490.51 
2602,Sale,"Approved 581068",52.82 
2603,Sale,"Approved 009275",88.10 

如何使這樣的:

2600,Sale,Approved,244.72 
2601,Sale,Approved,490.51 
2602,Sale,Approved,52.82 
2603,Sale,Approved,88.10 

通知後的數字批准都不見了以及報價。我可以刪除引號:

sed 's/,$//gn' file 

但我不知道如何刪除空格和數字。

謝謝!

+0

限制此條款僅適用於您所引用的專欄並應用sed's/[0-9] * // g' – SriniV

回答

1
sed "s/\"Approved[^,]*/Approved/g" 

它發現引用了「批准」,其次是任何非逗號字符,直到第一個逗號遇到,並與已批准(不包括引號)替換它

2600,Sale,Approved,244.72 
2601,Sale,Approved,490.51 
2602,Sale,Approved,52.82 
2603,Sale,Approved,88.10 
+0

謝謝!這很有效,因爲我也可以替換文件中的其他內容。最後做的是什麼? –

+1

非常好,很高興我能幫到你! '*'匹配前面任何一個表達式,它是任何不是逗號的字符。因此,它能夠匹配Approved,後面跟隨任意數量的非逗號字符,包括空格,數字和結尾引用,並且具有非貪婪的正確性屬性,因此它將盡可能匹配並且不會更多 - 將其與'Approved。*,'可以匹配這個CSV格式的其他幾個字段,這當然不是你想要的! – Alejandro

1

使用擴展的正則表達式與sed

sed -r 's/"([^[:space:]]*)[^"]*"/\1/g' file 

以上正則表達式針對任何帶引號的字符串。如果你想指定的字符串Approved,則:

sed -r 's/"(Approved)[^"]*"/\1/g' file 

有了基本的正則表達式:

sed 's/"\(Approved\)[^"]*"/\1/g' file 

針對任何引用字符串,用awk(僅當改變Approved[^[:space:]]*

1

的一種方式其他列不包含您的示例中的多個單詞):

awk -F"[ ,]" '{gsub("\"","");$1=$1}1' OFS=, file 
1
awk -F'[," ]' '{OFS=","; print $1,$2,$4,$7}' file 

輸出:

 
2600,Sale,Approved,244.72 
2601,Sale,Approved,490.51 
2602,Sale,Approved,52.82 
2603,Sale,Approved,88.10 

我想沒有其他空格。