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 !foo
uma 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, \!foo
nem '!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 é awk
isso que está fazendo. É a casca. !
é um caractere especial no shell.
O que fazer
Sempre cite seus argumentos. por exemplo
awk -F'!'