Existe uma maneira de sed
canalizar um grupo de captura para outro programa, tornando \1
o RHS da regexp igual à saída desse programa?
Por exemplo, correr
sed 's/lorem ipsum \(foobar\)/\1/g' file.txt
canalizaria "foobar" através de outro programa (por exemplo, tr 'o' 'a'
) para fazer \1
"faabar" para sed
substituir "lorem ipsum foobar" por "lorem ipsum faabar"?
Este é apenas um exemplo simples. Percebo que poderia converter "foobar" para "faabar" sem usar tr
.
Você pode com GNU sed - usando o
e
modificador (execute):( fonte )
mas tem utilidade limitada, pois executa e substitui todo o espaço de padrão, em vez de grupos de captura especificados. Então você precisaria pular por alguns aros muito feios.
Ex.
Que eu saiba: não.
É possível gravar o espaço de padrão em um arquivo usando
mas não o grupo de captura. Você pode executar um programa externo com
e você pode ler um arquivo com
mas não vejo uma maneira sustentável de fazer o que você está pedindo. E, francamente, você está no limite da utilidade
sed
daqui.awk
pode ser um pouco mais flexível aqui, mas este é o lugar ondeperl
está sua melhor opção, como @ikkachu já sugeriu em seu comentário.Como uma pequena idéia de quão trivial é em
perl
:(para aqueles mais versados em Perl: eu sei que é feio e pode precisar de um pouco de polimento antes de rodar em produção)