O que fazer

O que fazer

Quando uso !como separador de campos por exemplo awk -F!está dando mensagem de erro bash: !: event not found. Por que? Está aceitando awk -F"\!". Bash versão 3.2.25

Responder1

!é o personagem gatilho para Bashexpansão da história. Se estiver ativado, algo como !foouma linha de comando será expandido para o comando mais recente que começa com foo. Ou se não existir tal linha de comando, o shell apresenta um erro, como aqui.

Porém, não deveria fazer nada como o último caractere de uma palavra. Na verdade, isso funciona como pretendido em todas as versões do Bash que tentei:

$ echo 'aa!bb' | awk -F! '{print $1}' 
aa

Nas versões mais recentes, !também não deve fazer nada antes de aspas duplas no final, portanto -F"!"funciona em versões posteriores, mas não na 3.2.

Uma barra invertida ou aspas simples funcionarão para escapar dela, ou seja, \!foonem '!foo'expandiriam. É claro que você também pode pará-lo desativando completamente a expansão do histórico, com set +H.

Com aspas duplas é mais estranho. Dentro deles, uma barra invertida desativa a expansão do histórico, mas a própria barra invertida permanece no lugar:

$ printf '%s\n' "\!foo"
\!foo

No caso awk -F"\!"disso funciona porque o próprio awk remove a barra invertida.

Responder2

Não é awkisso que está fazendo. É a casca. !é um caractere especial no shell.

O que fazer

Sempre cite seus argumentos. por exemplo

awk -F'!'

informação relacionada