J'ai file.txt que je dois lire dans un tableau Bash. Ensuite, je dois supprimer les espaces, les guillemets doubles et tout sauf la première virgule dans chaque entrée . Voici jusqu'où je suis allé:
$ 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|
Ce qui fonctionne très bien, sauf pour la virgule. Je suis conscient qu'il existe plusieurs façons d'habiller ce chat, mais en raison du script plus important dont il fait partie, j'aimerais vraiment utiliser la substitution de paramètres pour arriver ici:
|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,need2|
|ELEMENT|60,see|
Est-ce possible via la substitution de paramètres?
awk
oused
faire le traitement des données?Réponses:
Je supprimerais ce que vous devez supprimer en utilisant
sed
avant de charger dans le tableau (notez également les noms de variables en minuscules, en général, il est préférable d'éviter les variables en majuscules dans les scripts shell):Cela produit la sortie suivante sur votre fichier d'exemple:
Si vous devez vraiment utiliser la substitution de paramètres, essayez quelque chose comme ceci:
la source
RANDOMTEXTTHATWILLNEVERBEINTHEFILE
.Pour autant que je puisse voir, il n'est pas nécessaire de le lire dans un
bash
tableau pour créer cette sortie:L'
sed
expression supprime les espaces et les guillemets doubles, remplace la première virgule par un espace (il n'y a pas d'autres espaces dans la chaîne à ce stade), supprime toutes les autres virgules, restaure la première virgule, et ajoute et ajoute les données supplémentaires.Alternativement, avec GNU
sed
:(la norme
sed
ne prend pas en charge la combinaison de2
et eng
tant que drapeaux de las
commande).la source
's/,//2g
pour supprimer les virgules, en commençant par le 2èmes/.*/|ELEMENT|&|/
mais cela peut être plus d'effort pour sed.Sortez de l'habitude d'utiliser des noms de variables ALLCAPS. Vous finirez par entrer en collision avec une variable "système" cruciale comme PATH et casser votre code.
la source
PATH=something; ls $PATH
, puis je me suis interrogée sur l'ls: command not found
erreur.[Il s'agit essentiellement d'une version plus développée de la réponse de glenn jackmann ]
Construire un tableau associatif à partir de la clé et de la valeur supprimées, en utilisant la première virgule comme séparateur:
la source
Vous pouvez faire une boucle sur le tableau et utiliser une variable intermédiaire:
Cela affecte à
rest
la partie après la première virgule; nous concaténons ensuite trois morceaux dans la variable d'origine:rest
de chaque virgule sans rienla source