Ich habe file.txt, die ich in ein Bash-Array einlesen muss. Dann muss ich Leerzeichen, doppelte Anführungszeichen und alle bis auf das erste Komma in jedem Eintrag entfernen . So weit bin ich gekommen:
$ cat file.txt
10,this
2 0 , i s
30,"all"
40,I
50,n,e,e,d,2
60",s e,e"
$ cat script.sh
#!/bin/bash
readarray -t ARRAY<$1
ARRAY=( "${ARRAY[@]// /}" )
ARRAY=( "${ARRAY[@]//\"/}" )
for ELEMENT in "${ARRAY[@]}";do
echo "|ELEMENT|$ELEMENT|"
done
$ ./script.sh file.txt
|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,n,e,e,d,2|
|ELEMENT|60,se,e|
Was bis auf die Kommasituation gut funktioniert. Ich bin mir bewusst, dass es mehrere Möglichkeiten gibt, diese Katze zu häuten, aber aufgrund des größeren Skripts, zu dem dies gehört, würde ich wirklich gerne die Parametersubstitution verwenden, um hierher zu gelangen:
|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,need2|
|ELEMENT|60,see|
Ist dies durch Parametersubstitution möglich?
awk
oder durchführensed
?Antworten:
Ich würde entfernen, was Sie mit entfernen müssen,
sed
bevor Sie in das Array laden (beachten Sie auch die Variablennamen in Kleinbuchstaben, im Allgemeinen ist es am besten, großgeschriebene Variablen in Shell-Skripten zu vermeiden):Dies erzeugt die folgende Ausgabe in Ihrer Beispieldatei:
Wenn Sie wirklich die Parametersubstitution verwenden müssen, versuchen Sie Folgendes:
quelle
RANDOMTEXTTHATWILLNEVERBEINTHEFILE
.Soweit ich sehen kann, muss es nicht in ein
bash
Array eingelesen werden , um diese Ausgabe zu erstellen:Der
sed
Ausdruck löscht Leerzeichen und doppelte Anführungszeichen, ersetzt das erste Komma durch ein Leerzeichen (zu diesem Zeitpunkt befinden sich keine weiteren Leerzeichen in der Zeichenfolge), löscht alle anderen Kommas, stellt das erste Komma wieder her und stellt die zusätzlichen Daten voran und hängt sie an.Alternativ mit GNU
sed
:(Standard
sed
unterstützt nicht die Kombination von2
undg
als Flags für dens
Befehl).quelle
's/,//2g
Kommas entfernen, beginnend mit dem 2.s/.*/|ELEMENT|&|/
aber das kann mehr Aufwand für sed sein.Machen Sie es sich nicht mehr zur Gewohnheit, ALLCAPS-Variablennamen zu verwenden. Sie werden schließlich mit einer entscheidenden "System" -Variablen wie PATH kollidieren und Ihren Code brechen.
quelle
PATH=something; ls $PATH
und mich dann über denls: command not found
Fehler gewundert .[Dies ist im Wesentlichen eine vollständigere Version von Glenn Jacksons Antwort ]
Erstellen eines assoziativen Arrays aus dem entfernten Schlüssel und Wert unter Verwendung des ersten Kommas als Trennzeichen:
quelle
Sie können das Array durchlaufen und eine Zwischenvariable verwenden:
Dies wird
rest
dem Teil nach dem ersten Komma zugewiesen; Wir verketten dann drei Teile wieder in die ursprüngliche Variable:rest
jedes Kommas durch nichtsquelle