O que $ 'text' faz exatamente no Bash? Pode ser usado em Zsh?

0

Recentemente, execute a seguinte solução proposta:

cat results.csv | tr $'\x01' \t > result.csv

para converter um arquivo csv malformado (um que use \x01 unicode como separador) em um arquivo correto.

O que exatamente $ '\ x01' diz ao bash para fazer? O comando parece não funcionar bem em Zsh.

Caso isso importe, o objetivo real é converter algo como:

b'flight_uid\twinning_price\tbid_price\timpressions_source_timestamp\n'b'0FY6ZsrnMy\x012000\x012270.0\x011427243278000\n0FamrXG9AW\x01710\x01747.0\x011427243733000\n0FY6ZsrnMy\x012000\x012270.0\x011427245266000\n0FY6ZsrnMy\x012000\x012270.0\x011427245088000\n0FamrXG9AW\x01330\x01747.0\x011427243407000\n0FamrXG9AW\x01710\x01747.0\x011427243981000\n0FamrXG9AW\x01490\x01747.0\x011427245289000\n0FamrXG9AW\x01735\x01747.0\x011427244634000\n0FamrXG9AW\x01420\x01747.0\x011427245595000\n0FamrXG9AW\x01470\x01747.0\x011427242443000\n0FK9yvBt9B\x011050\x011295.0\x011427242253000\n0FK9yvBt9B\x011050\x0112%

em um arquivo csv separado por tabulação regular.

Quando eu tento isso com o Zsh, recebo o seguinte, que não parece mudar nada:

b'flight_uid\twinning_price\tbid_price\timpressions_source_timestamp\n'b'0FY6ZsrnMy\x012000\x012270.0\x011427243278000\n0FamrXG9AW\x01710\x01747.0\x011427243733000\n0FY6ZsrnMy\x012000\x012270.0\x011427245266000\n0FY6ZsrnMy\x012000\x012270.0\x011427245088000\n0FamrXG9AW\x01330\x01747.0\x011427243407000\n0FamrXG9AW\x01710\x01747.0\x011427243981000\n0FamrXG9AW\x01490\x01747.0\x011427245289000\n0FamrXG9AW\x01735\x01747.0\x011427244634000\n0FamrXG9AW\x01420\x01747.0\x011427245595000\n0FamrXG9AW\x01470\x01747.0\x011427242443000\n0FK9yvBt9B\x011050\x011295.0\x011427242253000\n0FK9yvBt9B\x011050\x0112%

    
por Amelio Vazquez-Reina 27.03.2015 / 21:08

1 resposta

3

Na documentação do bash:

Words of the form $'string' are treated specially.  The word expands to
string, with backslash-escaped characters replaced as specified by  the
ANSI  C  standard.  Backslash escape sequences, if present, are decoded
as follows:
       \a     alert (bell)
(...)
       \nnn   the eight-bit character whose value is  the  octal  value
              nnn (one to three digits)
       \xHH   the  eight-bit  character  whose value is the hexadecimal
              value HH (one or two hex digits)

Então, no exemplo que você postou, $'\x01' é apenas o personagem com código 1, conforme sua descrição. Do meu (muito limitado) teste, este parece ser suportado por zsh também:

$ printf %s $'\x01' | od -t x1
0000000 01
0000001

No entanto, o comando tr que você postou só resolverá seu problema se assumirmos que seu arquivo na verdade contém o caractere literal com o código 1; parece a partir dos comentários que o que você tem em vez é a string de quatro caracteres \x01 em que o caractere de tabulação deve estar. O filtro a seguir deve corrigir essa condição:

sed 's/\x01/\t/g'
    
por 27.03.2015 / 21:09

Tags