2012-08-06 49 views
2

很抱歉,如果這聽起來很愚蠢,原諒這個新手。
這裏是我的代碼不同的「替代」上相同的字符串/行一個命令shell腳本

line="abcd<>efgh->higk<-1234" 
v1=$(echo ${line//<>/;}) 
echo $v1     --> outputs "abcd;efgh->hijk<-1234" 
v2=$(echo ${v1//->/}) 
echo $v2     --> output "abcd;efghhijk<-1234" 
echo ${$v2//<-/}   --> output "abcd;efghhijk1234" 

不存儲輸出到中間變量可我知道我能做到這一點的輸出 ABCD; efghhijk1234

感謝您的時間

+0

Bash參數替換不處理嵌套或組捕獲,所以你必須訴諸管道或像sed這樣的工具。 – Gingi 2012-08-06 17:54:02

+0

哦,我沒有在原代碼中使用回聲..只是用來查看輸出。 – stackex 2012-08-06 18:07:18

回答

3

您可以使用sed和管|到替換單獨的命令:

line="abcd<>efgh->highk<-1234" 
v1=$(echo ${line} | sed 's|<>|;|g' | sed 's|->||g' | sed 's|<-||g') 
echo $v1 

上面將輸出請求abcd;efghhijk1234

另外,如果你不想使用多個sed命令,你可以用-e選項結合他們所有:

v1=$(echo $line | sed -e 's/<>/;/g' -e 's/->\|<-//g'); 

注:我已經改變了裏面的sed -pattern從使用的分隔符在第二命令的|/

+0

非常感謝一羣 – stackex 2012-08-06 17:47:50

+0

不是我。你可以像這樣縮短:'echo $ {line // <> /;} | sed's/- > \ - < - // g'' – c00kiemon5ter 2012-08-06 17:53:22

+1

@ c00kiemon5ter是的,我想用'echo'來完成初始替換,但是顯示'sed'的用法,我只用'echo'輸出變量。我也可以完全跳過它並使用sed ... <<< $ line'。 – newfurniturey 2012-08-06 17:58:18

1

你不能用bash參數擴展在一行中完成所有操作,但是你可以使用bash的擴展模式匹配來同時刪除< - 和 - >。

shopt -s extglob 
line="abcd<>efgh->higk<-1234" 
v1=${line//<>/;} 
v2=${v1//@(->|<-)} 

由於兩個項目都被替換爲相同的替換文本(空字符串),所以您可以匹配它們中的任意一個。

+0

謝謝!!我的雙手無法接受多於一個答案 – stackex 2012-08-06 18:11:24

+0

另一個答案更好,因爲我最初誤解了你的問題,因爲我們想消除'v2',而不是'v1'。我會留下這個答案,作爲bash擴展模式的一個很好的例子,可能在其他時候派上用場。 – chepner 2012-08-06 18:16:31

相關問題