2012-10-01 14 views
1

我試圖想出一個正則表達式搜索/替換來封裝帶有大括號(例如; ${foo})的變量(例如; $foo)。我想出了下面的正則表達式,但它並不如預期運行:在同一行中多次替換模式

s/"\([^"]*\)\$\([a-zA-Z0-9:]*\)\([^"]*\)"/"\1\${\2}\3"/g 

不過,我有一些問題,這種模式。它只會爲每個引用的字符串執行一個模式。這是好的,因爲我可以在文件上多次運行表達式,但它不處理已經封裝在大括號中的變量。它只是把第二套大括號放在它們上面。

我現在的想法是剝離大括號\2,但我不認爲這將工作,因爲模式將仍然匹配,它將只執行每引號字符串1替換。我查看了反向引用表達式文檔,但我無法確定更好的方法。

回答

3

嘗試以下操作:

sed -e ':loop' -e 's/"\([^"]*\)\$\([a-zA-Z0-9:]\{1,\}\)\([^"]*\)"/"\1\${\2}\3"/' -e 't loop' 

這使得查找/替換成一個圈,這樣它會反覆嘗試在每一行更換,直到沒有更多的替代品可以做到的。

此操作,因爲被處理時不存在要運行多個命令時,纔會打印當前行,:loop創建一個名爲loop標籤,t loop返回執行到標號loop僅當有一個成功的替換。

正如在評論波東提到的,這個可以有多個報價行一些奇怪的行爲,這裏是應該在這些情況下正常工作的替代:

sed -e ':loop' -e 's/^\([^"]*\("[^"]*"[^"]*\)*\)"\([^"]*\)\$\([a-zA-Z0-9:]\{1,\}\)\([^"]*\)"/\1"\3\${\4}\5"/' -e 't loop' 
+0

太棒了,這與預期完全一致。謝謝。 – user1713098

+1

沒問題,如果我的答案奏效,你可以[接受它](http://meta.stackexchange.com/a/5235),點擊旁邊複選標記的大綱。 –

+0

這隻有在一行上只有一對'''',即數據如'a「b」$ c「d」'將以a結尾「a」b「$ {c}」d「 ' – potong

1

這可能會爲你工作(GNU SED ):

echo 'a "$a" b $b "b $b b $b" $c c $c "$c c $c"' | 
sed 's/"\([^"]*\)"/"\n\1\n"/g;:a;s/\n\n//;ta;s/\n\$\([a-zA-Z0-9:]\+\)/${\1\}\n/;ta;s/\n\(.\)/\1\n/;ta' 
a "${a}" b $b "b ${b} b ${b}" $c c $c "${c} c ${c}" 
+0

有關多重報價問題的好消息。 –

相關問題