2010-09-28 11 views
1

我有格式的行編輯以逗號分隔的路徑,大小對列表

parts=/a,1mb,/b/c,2gb,/zee/last,-1 #general form on next line 
parts=path1,size1,...,lastPath,-1 

我想newPath,newSize,使它看起來像

parts=newPathX,newSizeX,lastPath,-1 
全部更換 path1,size1 除了 lastplace,-1

我想如何使用至少有一個實例的','char如下

sed 's|^parts=.*,\(.*,-1\)$|parts=newPathX,newSizeX,\1|gi' 

但是,如果列表只有最後一個路徑和大小,就會中斷。例如,我想

parts=lastPath,-1 

被轉化爲

parts=newPathX,newSize,lastPath,-1 

所以,我想在bash與條件來解決這個問題:

egrep -i '^parts=.*,.*,-1$' $file 
if [[ $? -eq 0 ]] ; then 
    sed 's|^parts=.*,\(.*,-1\)$|parts='$new',\1|gi' $inp 
else 
    sed -i -e 's|^parts=|parts='$new',_gi' $file 
fi 

我想知道一個純粹的sed解決方案,因爲我可以很快理解它,但awk也會這樣做。

+0

我試圖修復格式,但很快放棄:(。@有些n00b - 請格式化您的代碼,所以我們不需要僱用codebreakers – 2010-09-28 05:49:49

+0

puthere_new =/a,1kb ,/ b,2mb,/ c,-1會變成什麼時候newplace是/ dd,大小是/ 2gb? – Gadolin 2010-09-28 05:51:09

+0

我應該快速粘貼我的bash作爲答案嗎?雖然我仍然想要一個組合的'正則表達式魔法'來解決這一個?? – Prince 2010-09-28 05:54:49

回答

1

嘗試使用AWK:

$ var='puthere=$place1,$size1,$place2,$size2,(..and so on..),$lastplace,-1' 
$ echo "$var" | awk -F"[=,]" -vnp="$newplace" -vns="$newsize" '/puthere/{print "puthere="np,ns,$(NF-1),$NF}' OFS="," 
puthere=test1,size1,$lastplace,-1 
+0

非常感謝你很好的'awk'腳本,我猜我必須現在開始挖掘awk :)但會要求單線sed魔術太多了? 再次感謝! – Prince 2010-09-28 07:06:41

+0

我問,因爲模式在文本文件中出現一行,有人可以告訴我如何將上面的內容轉換爲以$ 1 = filename作爲參數的內容,然後執行其他操作嗎? – Prince 2010-09-28 07:09:04

+1

有些時候可以通過不使用sed來簡化事情。 – ghostdog74 2010-09-28 07:21:26

0
sed '/^parts=.*,.*,-1$/ s|=.*,\([^,]*,-1\)$|=newPathX,newSizeX,\1|gi' 

有時,它也是在sed很簡單;-)。只需添加一個過濾器,以避免您的異常情況