Qué hacer

Qué hacer

Cuando lo uso !como separador de campos, por ejemplo, awk -F!aparece un mensaje de error bash: !: event not found. ¿Por qué? Es aceptar awk -F"\!". Versión de bash 3.2.25

Respuesta1

!es el carácter desencadenante de Bashexpansión de la historia. Si eso está habilitado, algo como !fooen una línea de comando se expande al último comando que comienza con foo. O si no existe dicha línea de comando, el shell da un error, como aquí.

Sin embargo, no debería hacer nada como último carácter de una palabra. En realidad, esto funciona como pretendía en todas las versiones de Bash que probé:

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

En versiones más recientes, !tampoco debería hacer nada antes de una comilla doble final, por lo que -F"!"funciona en versiones posteriores, pero no en 3.2.

Una barra invertida o comillas simples funcionarán para escapar de ella, es decir, ni ni \!foose '!foo'expandirían. Por supuesto, también puedes detenerlo desactivando completamente la expansión del historial, con set +H.

Con comillas dobles es más extraño. Dentro de ellos, una barra invertida desactiva la expansión del historial, pero la barra invertida se deja en su lugar:

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

En el caso de awk -F"\!"esto funciona porque el propio awk elimina la barra invertida.

Respuesta2

No es awkque esté haciendo esto. Es la concha. !es un carácter especial en el shell.

Qué hacer

Cite siempre sus argumentos. p.ej

awk -F'!'

información relacionada