2016-08-03 25 views
3

我怎麼掉特定的單詞與SED: 考慮輸入的一行(對我來說這是一個路徑):SED交換的話

foo/bar/TEST/foo/bar/... 

有並行路徑:

foo/bar/PROD/foo/bar/... 

我想這取決於原始路徑

我第一次嘗試是在交換TEST和PROD:

sed -e "s#TEST#PROD#g" -e "s#TEST#PROD/g" 

但遺憾的是:

echo "foo/bar/PROD/foo/bar/..." | sed -e "s#TEST#PROD#g" -e "s#PROD#TEST#g" 
result: foo/bar/TEST/foo/bar/... 

作品期望值,但

echo "foo/bar/TEST/foo/bar/..." | sed -e "s#TEST#PROD#g" -e "s#PROD#TEST#g" 
result: foo/bar/TEST/foo/bar/... 

不會改變任何東西,或更好的做到這些substitions。

我正在尋找第一個成功時不執行第二個替換的選項。

任何想法還是有更好的方法嗎?

+0

也許一個更好的例子會在輸入中包含TEST和PROD,例如, 'echo'foo/TEST/bar/PROD/foo'| sed'...''? –

回答

4

您可以使用測試操作符的sed

sed 's#TEST#PROD#g;t;s#PROD#TEST#g' file 

牛逼標籤
如果作爲///自上輸入線讀取並且因爲一個't做一個成功的替代或T命令,然後分支到標籤;如果省略標籤,則分支到 腳本的末尾。

由於沒有標籤,所以在手冊頁的摘錄中提到它將分支到腳本的末尾,這意味着不會執行更多命令。

+0

感謝'T'的竅門! –

2

這可能是你想要什麼:

$ echo 'foo/TEST/bar/PROD/foo' | 
    sed 's/TEST/\n/g; s/PROD/TEST/g; s/\n/PROD/g' 
foo/PROD/bar/TEST/foo 

並非所有SEDS將支持\n一個換行符,雖然。任何一項都將在任何sed的工作:

$ echo 'foo/TEST/bar/PROD/foo' | 
    sed 's/TEST/\ 
/g; s/PROD/TEST/g; s/\ 
/PROD/g' 
foo/PROD/bar/TEST/foo 

$ echo 'foo/TEST/bar/PROD/foo' | 
    sed 's/a/aA/g; s/TEST/aB/g; s/PROD/TEST/g; s/aB/PROD/g; s/aA/a/g' 
foo/PROD/bar/TEST/foo 

後者具有「優勢」,它會工作,即使你是夠瘋狂使用SEDS按住空格/緩衝區包含多行的內容。