Usando um comando dentro de uma substituição de sed

5

Estou tentando usar o sed para substituir uma sequência dos mesmos caracteres pela quantidade de caracteres nessa sequência, mas, de alguma forma, algo dá errado.

Estou tentando o seguinte:

echo aaabbdd | sed -e 's/a*/'"'wc -m &'/"

Mas isso retorna 0bbdd , enquanto eu gostaria que ele retornasse 3bbdd .

Eu realmente não sei exatamente o que dá errado. O sed parece saber o que substituir e tenta executar o comando wc, mas de alguma forma nós contamos algo vazio? Estou sem ideias de como resolver este problema, alguém pode me ajudar?

Obrigado!

    
por Chocolate_Althea 01.12.2016 / 20:19

1 resposta

5

O que você está tentando alcançar é realmente possível, mas apenas com o GNU sed, usando o comando e . Então, se você não se importa com possíveis problemas de portabilidade, experimente.

Por exemplo seu exemplo será parecido com isto:

>echo aaabbdd | sed -e 's/a*/echo 'echo -n & | wc -m'/;e'
3bbdd

se você remover o ; e , verá um comando intermediário (que ajuda a entender por que existem dois ecos)

echo 'echo -n aaa | wc -m'bbdd

Se você quiser substituir várias correspondências, isso pode ser mais complicado, mas ainda pode ser feito encadeando substituições:

>echo aabbaadd | sed -re 's/a+/'echo -n &|wc -m'/g;s/.*/echo &/;e'
2bb2dd

E certamente existem ferramentas melhores para a sua tarefa, como o awk , que possui uma função comprimento () .

Referências:

P.S.

Observe também que, se os dados de entrada contiverem citações, você terá que escapar com cuidado ou substituí-los temporariamente (por exemplo, com o comando sedy ///) para que isso funcione.

    
por 02.12.2016 / 00:08