Estou usando o GNU Awk 5.0.1 e preciso usar [}
ou [)
como FS
. Eu não posso fazer isso funcionar. Abaixo está o que eu tentei.
root@u2004:~# echo test | awk -F '[}' '{printf}'
awk: fatal: invalid regexp: Unmatched [, [^, [:, [., or [=: /[}/
root@u2004:~# echo test | awk -F '[\}' '{printf}'
awk: warning: escape sequence `\}' treated as plain `}'
awk: fatal: invalid regexp: Unmatched [, [^, [:, [., or [=: /[}/
root@u2004:~# echo test | awk -F '[\\}' '{printf}'
awk: fatal: invalid regexp: Unmatched [, [^, [:, [., or [=: /[\}/
root@u2004:~# echo test | awk -F '[}}' '{printf}'
awk: fatal: invalid regexp: Unmatched [, [^, [:, [., or [=: /[}}/
root@u2004:~# echo test | awk -F "[}" '{printf}'
awk: fatal: invalid regexp: Unmatched [, [^, [:, [., or [=: /[}/
root@u2004:~# echo test | awk -F "[\}" '{printf}'
awk: warning: escape sequence `\}' treated as plain `}'
awk: fatal: invalid regexp: Unmatched [, [^, [:, [., or [=: /[}/
root@u2004:~# echo test | awk -F "[\\}" '{printf}'
awk: warning: escape sequence `\}' treated as plain `}'
awk: fatal: invalid regexp: Unmatched [, [^, [:, [., or [=: /[}/
root@u2004:~# echo test | awk -F "[}}" '{printf}'
awk: fatal: invalid regexp: Unmatched [, [^, [:, [., or [=: /[}}/
root@u2004:~#
Como posso fazer isso?
Como qualquer string de vários caracteres usada como separador de campo de entrada (
FS
) será interpretada como uma expressão regular, a string deve ser uma expressão regular válida.Nada de especial deve ser feito com o
}
, mas a inicial[
deve ser escapada para ser correspondida como um colchete esquerdo literal. Você precisa de duas barras invertidas porque usar uma única barra invertida, como em\[}
, escaparia do colchete e definiria a expressão delimitadora como[}
, que é uma expressão regular inválida. Você também pode usar[[]
no lugar de\\[
, que corresponde a um literal[
usando uma expressão de colchetes, mas que não economiza na digitação e pode ser difícil de ler.Tomei a liberdade de corrigir o código também. A
printf
instrução recebe uma string de formato como argumento e, em seguida, uma ou mais expressões para a saída. Como você não fornece uma string de formato, você receberia um erro.Uma variante mais curta é usar
1
(ou qualquer string não vazia e diferente de zero). Isso funcionaria como um teste que é sempre verdade. Um teste verdadeiro acionaria a ação padrão, que é imprimir o registro atual (linha).... embora isso não fizesse nada empolgante além da saída de cada linha de entrada. Um teste mais útil do valor do delimitador seria
... que imprime o primeiro campo de cada registro de entrada, por exemplo,
{]ABC
se a entrada for{]ABC[}{]123[}
.Você pode tentar construir assim:
Requer apenas escape "duplo" de
[
para o registro, você pode usar variantes da construção como:
ou
Também uma construção como esta fará o trabalho:
A "lista" de delimitador opcional contém apenas
[
e deve ser seguida por}
PS Single
printf
não faz nada noawk
. Você deve adicionar alguns parâmetros como strings de formatação e variáveis a serem impressas. Como mencionado em outras respostas, se você quiser imprimir a linha inteira, use'1'
em vez de'{printf}'
Acho que as expressões de colchetes geralmente fornecem a solução mais simples para esses problemas de delimitador awk(!)ward. Então, de acordo com o comentário de @cas:
Certamente vale a pena se familiarizar com a sintaxe da expressão de colchetes. Mesmo que possa não parecer à primeira vista se você não estiver acostumado com eles, acho que a simplicidade e a utilidade geralmente são muito mais fáceis de escrever e ler do que, por exemplo, escapes duplos (!). E, claro, eles também podem ser usados em outros utilitários, como grep, etc.