2016-10-31 5 views
0
pattern="::a::b::" 
oldIFS=$IFS 
IFS="::" 
read -r -a extractees <<< $pattern 
IFS=$oldIFS 

ergibt sichbash - split-String in ein Array mit leeren Werten

{"a","b"} 

Ich brauche aber die Indizes zu halten, so will ich

{"","a","b",""} 

(zum Vergleich, wenn ich Wollte {"a","b"}, hätte ich

geschrieben

Warum? Weil diese Elemente lat sind Er wird wieder geteilt (auf einem anderen Trennzeichen) und die leeren "" Werte sollten zu einer leeren Liste führen dann.

Wie erreiche ich das?

+0

@Cyrus '' {"", "a", "b", ""} '' - wie ich in der Post selbst geschrieben habe. '' {"", "a", "", "b", ""} '' macht keinen Sinn wenn '' '' 'das Trennzeichen * und * die Indizes ändert. – User1291

Antwort

1

Kein Feldtrenner kann länger als 1 Zeichen sein, leider also '::' → ':'.

Abgesehen davon sollte Globbing explizit deaktiviert werden, um eine mögliche Dateinamenerweiterung in einer nicht-quoted Variablen zu verhindern.

set -f # disable globbing 
pattern=":a:b c:" 
oldIFS=$IFS 
IFS=":" 
extractees=($pattern) 
IFS=$oldIFS 

echo "'${extractees[0]}'" 
echo "'${extractees[1]}'" 
echo "'${extractees[2]}'" 
echo "'${extractees[3]}'" 
+0

Unquoted Parametererweiterungen sind auch keine zuverlässige Möglichkeit, eine Zeichenfolge in ein Array aufzuteilen. – chepner

+0

@echepner okay. '$ IFS' ist bereits gesetzt, so dass das einzige, was die Expansion ohne Anführungszeichen beeinflussen kann, das Globbing von Dateinamen ist. Es tritt jedoch hier nicht auf; gerade auf BASH 4.3 versucht. Ich weiß nicht, was der genaue Grund ist, dieser Fall ist scheinbar undokumentiert. Um auf der sicheren Seite zu sein, kann Globbing jedoch immer explizit über 'set -f' deaktiviert werden. Bearbeitet. – hidefromkgb

+0

@chepner aufeinanderfolgende Leerzeichen werden _only_ entfernt, wenn '$ IFS' dem Standardwert entspricht. [Prooflink] (http://www.tldp.org/LDP/abs/html/internalvariables.html#IFSH). – hidefromkgb

Verwandte Themen