gsar (pesquisa geral e substituição) é uma ferramenta muito útil exatamente para esse propósito .
A maioria das respostas a essa pergunta usa ferramentas baseadas em registros e vários truques para adaptá-las ao problema, como alternar o caractere separador de registro padrão para algo assumido como ocorrendo com freqüência suficiente na entrada para não tornar cada registro muito grande para lidar.
Em muitos casos, isso é muito bom e até mesmo legível. Eu gosto de problemas que podem ser facilmente / eficientemente resolvidos com ferramentas disponíveis em todos os lugares, como awk
, tr
, sed
e o shell bourne.
Realizar uma pesquisa binária e substituir em um arquivo grande e arbitrário com conteúdo aleatório não se encaixa muito bem com essas ferramentas unix padrão.
Alguns de vocês podem pensar que isso é uma fraude, mas não vejo como o uso da ferramenta certa para o trabalho pode estar errado. Neste caso, é um programa em C chamado gsar
que está licenciado sob GPL v2 , por isso me surpreende que não exista nenhum pacote para esta ferramenta muito útil em nenhum gentoo , redhat , nem ubuntu .
gsar
usa uma variante binária do algoritmo de pesquisa de strings Boyer-Moore .
O uso é direto:
gsar -F '-s<foobar>' '-r:x0A<foobar>'
em que -F
significa o modo "filtro", ou seja, leia stdin
em stdout
. Existem métodos para operar em arquivos também. -s
especifica a string de pesquisa e -r
da substituição. A notação de dois pontos pode ser usada para especificar valores arbitrários de byte.
O modo que não diferencia maiúsculas de minúsculas é suportado ( -i
), mas não há suporte para expressões regulares, já que o algoritmo usa o tamanho da string de pesquisa para otimizar a pesquisa.
A ferramenta também pode ser usada apenas para pesquisa, um pouco como grep
. gsar -b
exibe os deslocamentos de byte da string de pesquisa correspondente e gsar -l
imprime nome do arquivo e número de correspondências, se houver, um pouco como combinar grep -l
com wc
.
A ferramenta foi escrita por Tormod Tjaberg (inicial) e Hans Peter Verne (melhorias).