2013-02-05 41 views
0

我想使用sed處理屬性文件如:使用SED發現和匹配子內更換

java.home=/usr/bin/java 
groovy-home=/usr/lib/groovy 
workspace.home=/build/me/my-workspace 

我想和_更換.的和-的但只能達到=的標記。輸出將是

java_home=/usr/bin/java 
groovy_home=/usr/lib/groovy 
workspace_home=/build/me/my-workspace 

我試過各種方法,包括使用地址,但我一直失敗。有人知道怎麼做這個嗎?

+0

我可能是錯的,但我會認爲你不能用sed做到這一點。你不能使用awk或通用的腳本語言嗎? – troelskn

回答

1

AWK使得在這種情況下,生活更輕鬆:

awk -F= -vOFS="=" '{gsub(/[.-]/,"_",$1)}1' file 

在這裏你去:

kent$ echo "java.home=/usr/bin/java 
groovy-home=/usr/lib/groovy 
workspace.home=/build/me/my-workspace"|awk -F= -vOFS="=" '{gsub(/[.-]/,"_",$1)}1' 
java_home=/usr/bin/java 
groovy_home=/usr/lib/groovy 
workspace_home=/build/me/my-workspace 

,如果你真的想要做的sed(GNU sed的

sed -r 's/([^=]*)(.*)/echo -n \1 \|sed -r "s:[-.]:_:g"; echo -n \2/ge' file 

同樣的例子:

kent$ echo "java.home=/usr/bin/java 
groovy-home=/usr/lib/groovy 
workspace.home=/build/me/my-workspace"|sed -r 's/([^=]*)(.*)/echo -n \1 \|sed -r "s:[-.]:_:g"; echo -n \2/ge' 
java_home=/usr/bin/java 
groovy_home=/usr/lib/groovy 
workspace_home=/build/me/my-workspace 
0

在這種情況下,我會用AWK代替sed

awk -F"=" '{gsub("\\.|-","_",$1); print $1"="$2;}' <file.properties> 

輸出:

java_home/usr/bin/java 
groovy_home/usr/lib/groovy 
workspace_home/build/me/my-workspace 
+0

我想你錯過了在這裏添加OFS – user2134226

1

怎樣......

$ echo foo.bar=/bla/bla-bla | sed -e 's/\([^-.]*\)[-.]\([^-.]*=.*\)/\1_\2/' 
foo_bar=/bla/bla-bla 

這不會工作的情況下儘管如此,你還是有一個以上的點或短劃線。我將不得不進一步思考。

+0

+1。這就是我的回答,但你更快:) – DonCallisto

0

這適用於任意數量的線路點,連字符和不要求GNU sed的:

sed 'h; s/.*=//; x; s/=.*//; s/[.-]/_/g; G; s/\n/=/' < data 

以下是操作方法:

  • H:在保持空間保存行的副本
  • S:扔掉一切都在模式空間等號之前
  • X:交換模式和保持
  • S:打擊後了一切在圖案
  • S上的=:替換點和用下劃線連字符
  • G:加入圖案,並用一個新行保持
  • S:替換新行與等於它粘所有回到一起
0

其它方式使用sed的

sed -re 's/(.*)([.-])(.*)=(.*)/\1_\3=\4/g' temp.txt 

輸出

java_home=/usr/bin/java 
groovy_home=/usr/lib/groovy 
workspace_home=/build/me/my-workspace 

如果有超過.-左手邊那麼這

sed -re ':a; s/^([^.-]+)([\.-])(.*)=/\1_\3=/1;t a' temp.txt