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?
awk
osed
hacer el procesamiento de los datos?Respuestas:
Quitaría lo que necesita eliminar usando
sed
antes 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
bash
matriz para crear esa salida:La
sed
expresió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
sed
no admite la combinación de2
yg
como indicadores dels
comando).fuente
's/,//2g
para 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 $PATH
y luego me pregunté sobre ells: command not found
error.[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
rest
la porción después de la primera coma; Luego concatenamos tres piezas nuevamente en la variable original:rest
de cada coma con nadafuente