Como faço para escapar símbolo no shell script?

1

Eu quero escrever texto em outro arquivo usando o shell script echo , mas os dados não estão sendo gravados no formato exato como intento

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  ","","","","","","","","","","","","","","}'>allbands.csv >> jobstext.sh

mas estou recebendo um texto como este em 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,,,,,,,,,,,,,,

Eu tentei escapar do símbolo especial, mas os dados ainda não estão no formato exato.

Alguém pode me ajudar a fazer isso?

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  ","","","","","","","","","","","","","","}'>allbands1.csv
    
por gaurav singh 26.05.2017 / 11:24

3 respostas

1

Para evitar que o shell toque em seu texto (incluindo caracteres especiais como $ e > ou * , coloque tudo entre aspas simples. Para incluir aspas simples na string, é necessário interromper a string entre aspas e adicionar uma aspas simples com escape de barra invertida resultando em '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  ","","","","","","","","","","","","","","}'\''>allbands.csv' >> jobstext.sh
    
por Philippos 26.05.2017 / 12:16
0

É mais fácil dividir a impressão e usar as sequências de formatação printf para organizar a saída. Primeiro, o comando paste, aproveitando a expansão da chave:

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

Em seguida, o comando awk, simplificado usando OFS:

printf "| %s '%s' %s %s '%s' > %s\n" awk -F',|\t' -v OFS=, '{print , , , , , , , , , , , , , , }' allbands1.csv >> jobstext.sh

Você também pode usar %q para simplificar as strings de formato usadas para printf .

    
por muru 26.05.2017 / 13:23
0

Sem uma amostra de seus arquivos ou uma descrição clara do que você quer fazer ou o formato desejado do arquivo de saída, isso é mera adivinhação. Talvez você queira acrescentar uma linha de comando (cole coisas | ação do awk) ao arquivo jobstext.sh. Isso seria melhor feito usando um editor para evitar os problemas de cotação aninhados ...

Mas sua pergunta é sobre como escapar caracteres especiais, então responder que uma opção é encapsular uma aspa entre aspas duplas. Abreviando seus longos nomes de arquivos para B01, etc, isso seria o seguinte.

echo 'paste B01 B02 B03 B04 B05 B06 B07 B08 B8A B09 B10 B11 B12 |
awk -F",||\t" '"'"'{print "","","","","","","","","",
"","","","","","}'"'"' >allbands.csv' >> jobstext.sh

A primeira aspas simples inicia uma string que inclui o comando paste, nomes de arquivos, pipe, awk e opção F. Então a primeira aspa simples da sequência '"'"' fecha a string, os próximos 3 caracteres definem outra string de uma aspa simples, e o caractere final é uma aspas simples iniciando uma terceira string (que inclui a ação awk entre chaves). Uma seqüência de 5 citações semelhante fecha essa string, insere outra aspa simples e inicia a quinta string (que consiste em redirecionar a saída para allbands.csv). Finalmente essa string é fechada (com a última citação da linha), então todas as 5 strings são concatenadas e anexadas a jobstext.sh.

Isso é complicado, mas é isso que vem tentando usar dois níveis de uma única citação em uma linha de comando. As aspas simples são necessárias para evitar que a instrução awk seja interpretada pelo shell.

Melhorias seriam 1 / para usar nomes de arquivos que poderiam ser expandidos com * (mas seu "B8A" introduz uma inconsistência que impede expansão simples de nome de arquivo) e 2 / para simplificar o comando editando-o em jobstext.sh. As sugestões na resposta do @ muru valem a pena incorporar (mas tenha cuidado com o arquivo "B8A"!)

    
por Jeffrey Ross 29.05.2017 / 11:34