Como posso fazer esta declaração awk rodar no Windows?

1
awk '/DoLabelQuery\(self\)/||/QName\[[[[:digit:]][[[:digit:]]]/||/QName\[[[[:digit:]]]/ || /;BUTTON =/ || /endMethod/ || /endmethod/ ||  /add\(/ || /;CODE = /'  HELLO.fsl > x.txt

Eu sei que tem que ser feito em um arquivo e rodar usando awk -f. Eu simplesmente não consigo entender a sintaxe corretamente. O exemplo acima funciona no Linux no terminal.

Pode parecer complicado, mas tudo o que estou procurando são 5-6 exemplos de texto em que se encontrado leva a que a linha seja escrita para fora x.txt. O QNameelemento nome está apenas procurando QName[##]ou QName[#].

Peter Dixon
fonte
O que acontece quando você tenta executá-lo? Você pode nos dar uma amostra de entrada para testar? Tem que ser assim awk? Se você quer apenas linhas combinadas para ser impresso, grepparece uma boa ferramenta para o trabalho
Eric Renouf
Usando gawk-3.1.6para win32 eu tenho o seu comando para trabalhar se eu usei apenas aspas duplas em vez de aspas simples, isso funciona para você?
Eric Renouf
Usar aspas duplas não me deu um erro, mas produziu um resultado com zero bytes. O arquivo de entrada é um formato binário com ilhas de ASCII que estamos tentando segmentar. É difícil te dar isso. Você pode me mostrar qualquer exemplo awk similar do Windows onde um arquivo é usado para fornecer os comandos awk? Eu não consigo encontrar isso usando o Google.
Peter Dixon
O que você está usando awkno Windows? Eu recebo uma linha de saída se eu fizer, por exemplo: gawk "/cannot be run in DOS/" awk.exepara que gawkcom aspas duplas possam processar arquivos binários e encontrar ascii dentro deles
Eric Renouf
O problema parece estar relacionado à execução em um arquivo binário. Se eu remover os caracteres de controle, os comandos parecem funcionar bem, ou pelo menos uma versão simplificada dele funciona. Eu estou usando a versão mais recente do awk / gawk do gnuwin32.sourceforge.net/packages/gawk.htm .
Peter Dixon

Respostas:

1

Quando eu tentei executar o seu comando no começo eu recebi o erro:

awk: '/DoLabelQuery\(self\)/
awk: ^ invalid char ''' in expression
'/QName\[[[[:digit:]][[[:digit:]]]/' is not recognized as an internal or external command,
operable program or batch file.
'/QName\[[[[:digit:]]]/' is not recognized as an internal or external command,
operable program or batch file.
'/' is not recognized as an internal or external command,
operable program or batch file.
'/endMethod/' is not recognized as an internal or external command,
operable program or batch file.
'/endmethod/' is not recognized as an internal or external command,
operable program or batch file.
'/add\' is not recognized as an internal or external command,
operable program or batch file.
'/' is not recognized as an internal or external command,
operable program or batch file.

o que faz parecer que todas as partes do awkscript estão sendo analisadas como palavras separadas e muitas delas estão sendo processadas como se fossem comandos posteriores ||. Isso porque, como essa pergunta SO mostra que as aspas simples não são realmente citações no shell do Windows cmd, como estão em (na maior parte?) Shells do Linux. cmd usa apenas aspas duplas, o que felizmente funciona bem para este comando, parece, então a solução aqui é usar:

awk "/DoLabelQuery\(self\)/||/QName\[[[[:digit:]][[[:digit:]]]/||/QName\[[[[:digit:]]]/ || /;BUTTON =/ || /endMethod/ || /endmethod/ ||  /add\(/ || /;CODE = /"  HELLO.fsl > x.txt

Embora eu espere colocar os comandos em um arquivo e usá-lo dessa maneira deve funcionar também.

Eric Renouf
fonte
Eu tentei isso (simplesmente usando aspas duplas) e obtive um resultado de 0 byte. Nenhum erro, então isso é progresso, eu acho.
Peter Dixon