Tengo file.txt que necesito leer en una matriz Bash. Luego necesito eliminar espacios, comillas dobles y todo menos la primera coma en cada entrada . Aquí está lo lejos que he llegado:
$ 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|
Lo que funciona muy bien, excepto por la situación de coma. Soy consciente de que hay varias formas de desollar este gato, pero debido a la secuencia de comandos más grande de la que forma parte, realmente me gustaría usar la sustitución de parámetros para llegar aquí:
|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,need2|
|ELEMENT|60,see|
¿Es esto posible mediante la sustitución de parámetros?

awkosedhacer el procesamiento de los datos?Respuestas:
Quitaría lo que necesita eliminar usando
sedantes de cargar en la matriz (también tenga en cuenta los nombres de las variables en minúsculas, en general es mejor evitar las variables en mayúsculas en los scripts de shell):Esto produce el siguiente resultado en su archivo de ejemplo:
Si realmente debe usar la sustitución de parámetros, intente algo como esto:
fuente
RANDOMTEXTTHATWILLNEVERBEINTHEFILE.Por lo que puedo ver, no hay necesidad de leerlo en una
bashmatriz para crear esa salida:La
sedexpresión elimina espacios y comillas dobles, reemplaza la primera coma con un espacio (no hay otros espacios en la cadena en este punto), elimina todas las demás comas, restaura la primera coma, y antepone y agrega los datos adicionales.Alternativamente, con GNU
sed:(el estándar
sedno admite la combinación de2ygcomo indicadores delscomando).fuente
's/,//2gpara eliminar comas, comenzando con el segundos/.*/|ELEMENT|&|/pero eso puede ser más esfuerzo para sed.Salga del hábito de usar nombres de variables ALLCAPS. Eventualmente colisionará con una variable crucial del "sistema" como PATH y romperá su código.
fuente
PATH=something; ls $PATHy luego me pregunté sobre ells: command not founderror.[Esta es esencialmente una versión más desarrollada de la respuesta de Glenn Jackmann ]
Construir una matriz asociativa a partir de la clave y el valor despojados, utilizando la primera coma como separador:
fuente
Podría recorrer la matriz y usar una variable intermedia:
Esto se asigna a
restla porción después de la primera coma; Luego concatenamos tres piezas nuevamente en la variable original:restde cada coma con nadafuente