2016-07-25 5 views
0

ich die Zeichenfolge haben, wie folgt:, wie Räume mit Unterstrich und doublequotes mit nichts in bash ersetzen

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

Jetzt kann ich diese Methode verwenden, um die Räume mit Unterstrichen

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

Und kann ersetzen das gleiche tun " doppelte Anführungszeichen mit nichts zu ersetzen

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

Jetzt kann ich sed das gleiche zu tun - die Räume mit Unterstrichen

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

Und ich dann die doppelten Anführungszeichen, indem Sie diesen sed s/'"'/''/g

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

Also das ist, was ich will (spaces repalaced mit Strich entfernen zu ersetzen und doppelte Anführungszeichen entfernt), aber kann ich es erreichen, indem ich meinen ersten Ansatz oben z

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

Dies ist mein Versuch

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

edit1 ist dies die sed ich erreichen kann, aber ich möchte diese

durch mein erster Ansatz zu erreichen in der Lage sein
$ echo "NAME_"$val1"_NAME" | sed s/" "/_/g | sed s/'"'/''/g 
NAME_$29.95_Carryover_Plan_1GB_NAME 
+0

siehe [hier] (http://stackoverflow.com/a/38559775/2392358) 'a =" NAME _ $ {$ {val1 ///_} // "/" _ NAME "' kann in gemacht werden zsh – HattrickNZ

Antwort

3

Es gibt Es gibt keine Möglichkeit, Zeichenfolgenbearbeitungsoperationen für eine Variable zu verschachteln, da der erste Parameter in ${var/sub/rep} ein Variablenname und keine Zeichenfolge ist.

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

Zufälligerweise ist sed eine Skriptsprache; Sie können mehrere Ersetzungen in einem Skript durchführen. Siehe combining 2 sed commands.

1

Sorry, Sie können nicht.die Angabe ist auch falsch in alle Ihre Befehle:

Falsch:

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

Rechts:

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

Falsch:

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

Rechts:

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

Falsch:

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

Rechts:

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

Falsch:

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

Rechts:

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

Falsch:

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

Rechts:

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

Falsch:

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

Rechts:

There is no right way to write that. 

Falsch:

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

Rechts:

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

Sehen Sie, wenn Sie zitiert ein Tutorial über Shell finden, bevor es dich beißt.

+0

Wenn Sie falsch sagen, speziell in Ihrem ersten falsch/richtig, meinst du schlechte Syntax? Ich akzeptiere deinen Punkt mit den Anführungszeichen in 'sed' das sieht besser aus,' echo "$ val1" | sed 's// _/g'', aber es gibt das gleiche Ergebnis, vielleicht könntest du es einfach kommentieren.tks – HattrickNZ

+1

Ich meine, potentiell gefährlich und wird auf seltsame und wundervolle Weise bei verschiedenen Werten der Shell-Variablen und/oder des Verzeichnisses, von dem du den Befehl ausführst, abweichen/oder Ihre Umgebung Einstellungen.Google etwas wie "immer zitieren Shell-Variablen", um Artikel wie http://unix.stackexchange.com/a/171347/133219, die das Problem zu diskutieren. –

Verwandte Themen