Eu quero manter uma lista de substituições em um arquivo de comando:
subs.sed
s/hello/foo/g
s/world/bar/g
eu corro assimsed -i -f subs.sed file.txt
file.txt
transforma-se de hello world
em foo bar
.
Eu gostaria de impedir que isso acontecesse: se file.txt
for helloworld
, não gostaria que nenhuma das duas substituições acima acontecesse. A saída atualmente seria foobar
, mas eu gostaria que a saída fosse helloworld
.
Eu poderia especificar manualmente os limites das palavras no arquivo de comando:
s/\<hello\>/foo/g
s/\<world\>/bar/g
Mas eu preferiria manter este arquivo o mais legível possível, e não ocultá-lo com esse tipo de verbosidade.
Existe uma opção de linha de comando que eu possa ativar sed
para corresponder apenas a palavras inteiras? Claro, se houver outra maneira de editar a linha de comando (executar sed no arquivo de comando antes de executar sed com ele? Mas estou preocupado em analisar substituições complexas) que seja o mais à prova de balas possível, isso também seria ótimo.
Este é GNU sed no Ubuntu 22.04
Em primeiro lugar, se você estiver executando GNU
sed
, o padrão em sistemas Linux, também poderá simplificar seused
uso\b
em vez de\>
e\<
o que pode torná-lo mais legível para você:Dito isso, acho que você não pode fazer o que descreve, mas aqui está uma solução alternativa: mantenha seu arquivo como está, mas adicione uma etapa de pré-processamento:
Aqui, estamos passando dois comandos para
sed
. A primeira substituirá a primeira ocorrência de/
com/\<
e a segunda substituirá a segunda/
por/\>
. Precisamos\\>
de e\\<
porque\
é o caractere de escape, então precisamos escapá-lo adicionando outro\
para tratá-lo como uma barra invertida literal. Então, o2
no final do segundo comando significa "faça isso na segunda correspondência da linha". Isso é mais fácil de explicar com um exemplo:Então, com esse comando em mãos, você pode criar um pequeno alias que execute suas substituições reais, desde que você esteja usando um shell que entenda
<()
para Substituição de Processo :E, para facilitar um pouco a sua vida, você pode adicionar esta linha ao arquivo de inicialização do seu shell (
~/.bashrc
por exemplo) para fazer um alias:Abra um novo terminal e agora você pode executar
mysub file
e obter a saída esperada.