2017-05-13 81 views
2

我想用sed來替換完整源文件樹中每個特定文本的出現。我試過以下內容: $ grep -rlI name2port\(\"Wan1\"\) . --exclude-dir=.svn --exclude=*.vxs | xargs sed -i 's/name2port\(\"Wan1\"\)/T_PORT_ID_WAN1/g'但它似乎並不奏效,我認爲我的sed cmd不正確。
我該怎麼做?用sed遞歸替換文本

問題是,替代品不會發生。

我試過這個:$ sed -i 's/name2port\(\"Wan1\"\)/T_PORT_ID_WAN1/g' ./rtos_core/jpax_switch/api/src/nms/switch_l3_route.c但事實證明,name2port("Wan1")的出現不會被替換。令人驚訝的用於現代的正則表達式的人 - - 需要逃避一定元字符才能被認定爲

回答

3

sed默認,其中,由於歷史的原因使用BREs裏面(基本正則表達式)這樣。

在BREs,()普通(文字)字符,只有成爲特殊的時候\轉義。

因此,以配合文字name2port("Wan1"),使用文字原樣在BRE(因爲你也不必\ -escape "實例):

sed -i 's/name2port("Wan1")/T_PORT_ID_WAN1/g' ./rtos_core/jpax_switch/api/src/nms/switch_l3_route.c 

如果」不關心可移植性,你可以使用-r(或-E有限可移植性macOS,但-i將無法​​工作),然後啓用EREs(擴展正則表達式),它的語法和功能更有可能像您期望工作:

sed -r -i 's/name2port\("Wan1"\)/T_PORT_ID_WAN1/g' ./rtos_core/jpax_switch/api/src/nms/switch_l3_route.c 

說明文字()現在需要如何做\轉義,以免他們被解釋爲附上一個捕獲組。

在這種特殊情況下,BRE比ERE的逃逸要少;但一般來說,情況恰恰相反。