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).