Uma proposta desta pergunta .
Digamos que eu queira substituir <number with commas>
em <number>
string something, "10,000", something
.
O número pode ser 1,000
, 10,000
... e assim por diante.
Eu estava experimentando se é possível usar um comando para a substituição:
echo 'something, "10,000", something' | sed "s/\(\".*\"\)/$(echo \\1 | sed 's/,//')/"
O que não funciona, nada acontece.
O que desencadeia minha pergunta é que, se eu usar apenasecho
echo 'something, "10,000", something' | sed "s/\(\".*\"\)/$(echo \\1)/"
o parâmetro \\1
é lido como OK, mas parece que não pode ser canalizado para sed
(ou grep
).
Isso é possível de alguma forma?
A expansão da substituição do comando que faz parte da sua
sed
expressão acontece antes que osed
comando seja executado.Isso significa que o shell, para executar o comando
primeiras corridas
Isso é gerado
\1
, pois não há vírgulas na string gerada porecho
.O shell então insere essa string onde estava a substituição do comando, produzindo
Isso também fica claro se executarmos o pipeline com o rastreamento ativado no shell:
Em seu segundo pipeline, acontece a mesma coisa (menos a execução de
sed 's/,//'
):Em conclusão: não é possível chamar outro comando shell de dentro
sed
usando substituições de comando para processar uma substring correspondida por uma expressão regular, pois as substituições de comando são processadas antessed
de ser chamado (para resolver o quesed
é o script de edição antes de chamarsed
).sed
além disso, não fornece nenhum mecanismo em sua linguagem para chamar outro comando, como algumas outras linguagens de edição/processamento fazem (por exemplo, os comandosr
e rudimentares no editor permitem isso, assim como ).w
ed
awk
Isso funciona apenas se houver pelo menos dois números entre duas vírgulas, então