2016-07-25 29 views
0

我有串如下:如何更換用下劃線空格和雙引號什麼也沒有在bash

$ echo "$val1" 
"$29.95 Carryover Plan 1GB" 

現在我可以用這個方法用下劃線

$ echo "NAME_"${val1// /_}"_NAME" 
NAME_"$29.95_Carryover_Plan_1GB"_NAME 

並能替代空間做同樣什麼也沒有

$ echo "NAME_"${val1//'"'/}"_NAME" 
NAME_$29.95 Carryover Plan 1GB_NAME 

更換"雙引號現在,我可以使用SED做同樣的 - 用下劃線

$ echo "$val1" | sed s/" "/_/g 
"$29.95_Carryover_Plan_1GB" 

,然後我可以加入這個sed s/'"'/''/g

$ echo "$val1" | sed s/" "/_/g | sed s/'"'/''/g 
$29.95_Carryover_Plan_1GB 

除去雙引號來代替空格所以這就是我想要的(空間repalaced帶下劃線和雙引號刪除),但我可以實現它使用我的第一種方法,例如

$ echo "NAME_"${val1// /_}"_NAME" 
NAME_"$29.95_Carryover_Plan_1GB"_NAME 

這是我嘗試

$ echo "NAME_"${${val1// /_//'"'/}}"_NAME" 
-sh: "NAME_"${${val1// /_//'"'/}}"_NAME": bad substitution 

EDIT1這是sed的,我可以做到,但我希望能夠通過我的第一種方法來實現這一

$ echo "NAME_"$val1"_NAME" | sed s/" "/_/g | sed s/'"'/''/g 
NAME_$29.95_Carryover_Plan_1GB_NAME 
+0

看到[這裏](http://stackoverflow.com/a/38559775/2392358)'a =「NAME _ $ {$ {val1 ///_} // \」/} _ NAME「'可以在zsh – HattrickNZ

回答

3

有無法在變量上嵌套字符串操作操作,因爲${var/sub/rep}中的第一個參數是變量名稱,而不是字符串。

NAME='"$29.95 Carryover Plan 1GB"' 
NAME=${NAME// /_} 
NAME=${NAME//\"/} 

巧合的是,sed是一種腳本語言;您可以在一個腳本中簡單地執行多個替換。見combining 2 sed commands

1

對不起,你不能。此外,報價是錯誤的所有命令:

錯誤:

$ echo "NAME_"${val1// /_}"_NAME" 
NAME_"$29.95_Carryover_Plan_1GB"_NAME 

右:

$ echo "NAME_${val1// /_}_NAME" 
NAME_"$29.95_Carryover_Plan_1GB"_NAME 

錯誤:

$ echo "NAME_"${val1//'"'/}"_NAME" 
NAME_$29.95 Carryover Plan 1GB_NAME 

右:

$ echo "NAME_${val1//\"/}_NAME" 
NAME_$29.95 Carryover Plan 1GB_NAME 

錯誤:

$ echo "$val1" | sed s/" "/_/g 
"$29.95_Carryover_Plan_1GB" 

右:

$ echo "$val1" | sed 's/ /_/g' 
"$29.95_Carryover_Plan_1GB" 

錯誤:

$ echo "$val1" | sed s/" "/_/g | sed s/'"'/''/g 
$29.95_Carryover_Plan_1GB 

右:

$ echo "$val1" | sed 's/ /_/g; s/"//g' 
$29.95_Carryover_Plan_1GB 

錯誤:

$ echo "NAME_"${val1// /_}"_NAME" 
NAME_"$29.95_Carryover_Plan_1GB"_NAME 

右:

$ echo "NAME_${val1// /_}_NAME" 
NAME_"$29.95_Carryover_Plan_1GB"_NAME 

錯誤:

$ echo "NAME_"${${val1// /_//'"'/}}"_NAME" 
-sh: "NAME_"${${val1// /_//'"'/}}"_NAME": bad substitution 

右:

There is no right way to write that. 

錯誤:

$ echo "NAME_"$val1"_NAME" | sed s/" "/_/g | sed s/'"'/''/g 
NAME_$29.95_Carryover_Plan_1GB_NAME 

右:

$ echo "NAME_${val1}_NAME" | sed 's/ /_/g; s/"//g' 
NAME_$29.95_Carryover_Plan_1GB_NAME 

看看你是否可以找到shell引用它咬你之前的教程。

+0

當你說錯了,特別是在你的第一個錯誤/右邊,你的意思是不好的語法?我接受你的觀點與'sed'中的引號看起來更好,'echo「$ val1」| sed's// _/g'',但它確實給出了相同的結果。也許你可以brifly comment.tks – HattrickNZ

+1

我的意思是潛在的危險,並會給出不同的shell變量值和/或執行命令的目錄的奇怪和美妙的方式失敗和/或者你的環境設置,谷歌像「總是引用shell變量」來查看討論這個問題的文章,例如http://unix.stackexchange.com/a/171347/133219。 –

相關問題