¿Cómo puedo escapar del símbolo en el script de Shell?

¿Cómo puedo escapar del símbolo en el script de Shell?

Quiero escribir texto en otro archivo usando un script de shell, echopero los datos no se escriben en el formato exacto como pretendía.

echo paste B01_reprojected_subset_comma_updated.csv  B02_reprojected_subset_comma_updated.csv B03_reprojected_subset_comma_updated.csv B04_reprojected_subset_comma_updated.csv B05_reprojected_subset_comma_updated.csv B06_reprojected_subset_comma_updated.csv B07_reprojected_subset_comma_updated.csv B08_reprojected_subset_comma_updated.csv B8A_reprojected_subset_comma_updated.csv B09_reprojected_subset_comma_updated.csv B10_reprojected_subset_comma_updated.csv B11_reprojected_subset_comma_updated.csv B12_reprojected_subset_comma_updated.csv |awk -F",||\t" '{print  $1","$2","$3","$6","$9","$12","$15","$18","$21","$24","$27","$30","$33","$36","$39}'>allbands.csv >> jobstext.sh

pero recibo un texto como este en jobstext.sh

paste B01_reprojected_subset_comma_updated.csv B02_reprojected_subset_comma_updated.csv B03_reprojected_subset_comma_updated.csv B04_reprojected_subset_comma_updated.csv B05_reprojected_subset_comma_updated.csv B06_reprojected_subset_comma_updated.csv B07_reprojected_subset_comma_updated.csv B08_reprojected_subset_comma_updated.csv B8A_reprojected_subset_comma_updated.csv B09_reprojected_subset_comma_updated.csv B10_reprojected_subset_comma_updated.csv B11_reprojected_subset_comma_updated.csv B12_reprojected_subset_comma_updated.csv,,,,,,,,,,,,,,

Intenté escapar del símbolo especial pero aún los datos no están en el formato exacto.

¿Alguien puede ayudarme a hacer esto?

paste B01_reprojected_subset_comma_updated.csv B02_reprojected_subset_comma_updated.csv B03_reprojected_subset_comma_updated.csv B04_reprojected_subset_comma_updated.csv B05_reprojected_subset_comma_updated.csv B06_reprojected_subset_comma_updated.csv B07_reprojected_subset_comma_updated.csv B08_reprojected_subset_comma_updated.csv B8A_reprojected_subset_comma_updated.csv B09_reprojected_subset_comma_updated.csv B10_reprojected_subset_comma_updated.csv B11_reprojected_subset_comma_updated.csv B12_reprojected_subset_comma_updated.csv |awk -F",||\t" '{print  $1","$2","$3","$6","$9","$12","$15","$18","$21","$24","$27","$30","$33","$36","$39}'>allbands1.csv

Respuesta1

Para evitar que el shell toque su texto (incluidos caracteres especiales como $y >o *, coloque todo entre comillas simples. Para incluir comillas simples en la cadena, debe interrumpir la cadena entre comillas y agregar una comilla simple con barra invertida, lo que da como resultado 'here comes the embedded '\''quote':

echo 'paste B01_reprojected_subset_comma_updated.csv  B02_reprojected_subset_comma_updated.csv B03_reprojected_subset_comma_updated.csv B04_reprojected_subset_comma_updated.csv B05_reprojected_subset_comma_updated.csv B06_reprojected_subset_comma_updated.csv B07_reprojected_subset_comma_updated.csv B08_reprojected_subset_comma_updated.csv B8A_reprojected_subset_comma_updated.csv B09_reprojected_subset_comma_updated.csv B10_reprojected_subset_comma_updated.csv B11_reprojected_subset_comma_updated.csv B12_reprojected_subset_comma_updated.csv |awk -F",||\t" '\''{print  $1","$2","$3","$6","$9","$12","$15","$18","$21","$24","$27","$30","$33","$36","$39}'\''>allbands.csv' >> jobstext.sh

Respuesta2

Es más fácil si divide la impresión y utiliza printfcadenas de formato para organizar la salida. Primero, el comando pegar, aprovechando la expansión de llaves:

printf "%s " paste B{01..12}_reprojected_subset_comma_updated.csv >> jobstext.sh

Luego, el comando awk, simplificado usando OFS:

printf "| %s '%s' %s %s '%s' > %s\n" awk -F',|\t' -v OFS=, '{print $1, $2, $3, $6, $9, $12, $15, $18, $21, $24, $27, $30, $33, $36, $39}' allbands1.csv >> jobstext.sh

También puede utilizar %qpara simplificar las cadenas de formato utilizadas para printf.

Respuesta3

Sin una muestra de sus archivos o una descripción clara de lo que quiere hacer o el formato deseado del archivo de salida, esto son meras conjeturas. Quizás desee agregar una línea de comando (pegar cosas|acción awk) al archivo jobstext.sh. Sería mejor hacerlo usando un editor para evitar los problemas de citas anidadas...

Pero su pregunta se refiere a los caracteres especiales de escape, por lo que responder esa opción es encapsular una comilla simple entre comillas dobles. Abreviando los nombres de archivos largos a B01, etc., esto se vería como se muestra a continuación.

echo 'paste B01 B02 B03 B04 B05 B06 B07 B08 B8A B09 B10 B11 B12 |
awk -F",||\t" '"'"'{print "$1","$2","$3","$6","$9","$12","$15","$18","$21",
"$24","$27","$30","$33","$36","$39}'"'"' >allbands.csv' >> jobstext.sh

La primera comilla simple inicia una cadena que incluye el comando pegar, nombres de archivos, canalización, awk y la opción F. Luego, la primera comilla simple de la '"'"'secuencia cierra la cadena, los siguientes 3 caracteres definen otra cadena de una comilla simple y el carácter final es una comilla simple que comienza una tercera cadena (que incluye la acción awk entre llaves). Una secuencia similar de 5 comillas cierra esa cadena, inserta otra comilla simple e inicia la quinta cadena (que consiste en redirigir la salida a allbands.csv). Finalmente, esa cadena se cierra (con la última comilla de la línea), por lo que las 5 cadenas se concatenan y se agregan a jobstext.sh.

Esto es engorroso, pero eso es lo que sucede al intentar utilizar dos niveles de comillas simples en una línea de comando. Las comillas simples son necesarias para evitar que el shell interprete la declaración awk.

Las mejoras serían 1/ usar nombres de archivos que podrían ampliarse *(pero su "B8A" introduce una inconsistencia que impide la expansión simple de nombres de archivos), y 2/ simplificar el comando editándolo en jobstext.sh. Vale la pena incorporar las sugerencias en la respuesta de @muru (¡pero tenga cuidado con ese archivo "B8A"!)

información relacionada