Substituição de string pelo iterador

2

Eu tenho um arquivo com um caractere que gostaria de substituir, mas também quero que cada instância do caractere seja substituída, seja iterada com um número dentro da substituição de sting.

SomeFile.txt

[H
A
[H
B
[H
C

Eu quero substituir "[H" por " </pre></div><div id=cat$n><pre> ", em que $ n é um interator para o número de substituições. Então a primeira substituição seria 1, 2, 3, 4, n ++ e assim por diante.

Existe uma maneira de fazer isso com sed ?

    
por j0h 06.04.2016 / 19:26

3 respostas

5

Perl para o resgate!

perl -pe 'BEGIN { $n = 1 } s%\[H%</pre></div><div id=cat$n><pre>% && $n++' filename
  • -p lê a entrada linha por linha e imprime o que o código faz com ela
  • BEGIN { ... } é executado antes de o programa ser inserido
  • s%pattern%replacement% substitui pattern por replacement .
  • \[ precisa de uma barra invertida, porque [ é especial em expressões regulares
  • && $n++ Se a substituição for bem sucedida, ela retornará true, então o próximo comando é executado: e incrementa o contador $n .
por choroba 06.04.2016 / 19:39
4

Outra maneira do awk, tratando [H como separador de registro:

awk -v RS='\[H' 'NR>1{printf "</pre></div><div id=cat%d><pre>",NR-1}1'

Todos, exceto o primeiro registro, terão [H antes, portanto, para esses registros, imprimo um </pre></div><div id=catN><pre> , em que N = NR - 1 ( NR é o número do registro) antes do próprio registro.

$ awk -v RS='\[H' 'NR>1{printf "</pre></div><div id=cat%d><pre>",NR-1}1' foo.txt

</pre></div><div id=cat1><pre>
A

</pre></div><div id=cat2><pre>
B

</pre></div><div id=cat3><pre>
C

Com o GNU awk, você pode usar o novo módulo de modificação inplace:

gawk -i inplace  -v RS='\[H' 'NR>1{printf "</pre></div><div id=cat%d><pre>",NR-1}1' foo.txt

Isso é semelhante a sed -i .

    
por muru 06.04.2016 / 21:13
2

AWK versão. Observe como [ é escapado e como as cotações são organizadas para permitir que a variável counter seja expandida em "</pre></div><div id=cat"counter"><pre>" :

$ awk '{ if ( $0~/\[H/ ){\                                                     
>    counter++; sub(/\[H/,"</pre></div><div id=cat"counter"><pre>")\           
> }; print }' test_input.txt                                                   
</pre></div><div id=cat1><pre>
A
</pre></div><div id=cat2><pre>
B
</pre></div><div id=cat3><pre>
C
</pre></div><div id=cat4><pre>

A menos que você esteja usando gawk , use a abordagem gawk '...' input_file.txt > /tmp/tmp.txt && mv /tmp/tmp.txt input_file.txt para substituir o arquivo original pela versão editada

Adição

Como o muru sugeriu, o código pode ser simplificado para

awk '/\[H/{counter++; sub(/\[H/,"</pre></div><div id=cat"counter"><pre>")}1' test_input.txt
    
por Sergiy Kolodyazhnyy 06.04.2016 / 20:09