stream editando ferramentas: produza o que é raspado

1

Eu estava apenas imaginando se era possível usar diferentes ferramentas de edição de fluxo e processamento / manipulação de texto; como o grep, corte, sed, awk, perl etc. Existem maneiras de saída (na forma de um arquivo ou STDOUT) o inverso da saída (para colocar de outra forma, o que nunca foi extraído ao executar o comando) de uma maneira universal, ou seja, com outro aplicativo, em vez de usar os recursos de ferramentas e sinalizadores opcionais para realizá-lo.

Então, por exemplo:

Isso imprimiria as linhas em um arquivo que corresponde ao regex:

sed '/regexp/!d

Isso imprimiria as linhas em um arquivo que não correspondem ao regex:

sed '/regexp/d'

É possível simplesmente executar apenas um desses comandos e também ter os dados que não estão contidos STDOUT para serem também mostrados em algum lugar também, sem usar as opções do sed, mas sim um método universal que poderia então ser aplicado a um awk ou comando grep.

Você poderia fazer algo assim, usando conn e enviar o comando sed para um arquivo e, em seguida, comparar o arquivo original com o arquivo gerado e gerar a diferença. Algo como (também estou certo de que a sintaxe está incorreta, mas espero que a lógica seja atingível):

comm <(sort originalFile) <(sort sedProcessedFile) > originalFileMinussedProcessedFile

source

Mas não apenas aplique isso ao sed mas qualquer tipo de ferramenta de manipulação de texto / fluxo, ou pelo menos awk e perl.

    
por thomascrha 15.10.2015 / 16:22

1 resposta

3

Não há um método geral para isso. Os filtros estão apenas lendo e gravando fluxos, eles não estão modificando o fluxo no lugar, e a relação entre eles é totalmente arbitrária e dependente da ferramenta em particular. Portanto, não há como um mecanismo de propósito geral saber que algo foi "removido" da entrada e, portanto, salvá-lo para ser copiado para a saída.

Mas ferramentas como awk e perl podem gravar em arquivos arbitrários sozinhos, para que possam fazer isso com código explícito:

awk '/regexp/ { print } !/regexp/ { print > "non-matching.txt" }' > matching.txt
    
por 15.10.2015 / 16:46