Sed: Substitua N primeiras ocorrências de um caractere

4

Eu estou olhando para substituir as 5 primeiras ocorrências do caractere de espaço em branco por linha dentro de um script sed. Aqui está o que eu tenho até agora

sed -e "s/ /;/" -e "s/ /;/" -e "s/ /;/" -e "s/ /;/" -e "s/ /;/" myfile

Existe alguma maneira mais agradável de fazer isso?

Para o registro, estou usando o Solaris sed. Eu não sei se isso faz alguma diferença.

    
por rahmu 21.09.2011 / 14:26

2 respostas

3

Será mais fácil manter a sua ideia básica do que fazer algum malabarismo sedativo iterativo. Talvez um loop simples para construir o padrão facilite o trabalho.

pat=; for ((i=1; i<=5; i++)) ;do pat="$pat s/ /;/;"; done
sed -e "$pat" myfile

ou simplesmente dispense as várias opções de expressão -e e apenas agrupe todas elas com o separador ; expression.

sed -e "s/ /;/; s/ /;/; s/ /;/; s/ /;/; s/ /;/" myfile

Aqui está a versão apenas , com a qual você provavelmente não se importará, mas que permite especificar qualquer número de substituições. (via o {5} ) ...

sed -nre ':check;G;/^.*\nx{5}$/{b print};s/^(.*)\n.*$//;s/ /;/;t inc-tally;:print;P;x;s/.*//;x;b;:inc-tally;x;s/(.*)/x/;x;b check' myfile

O one-liner (?) é um pouco assustador, então aqui está como um código estruturado, para ser chamado através de um arquivo sed-script: sed -nrf "$fsed" myfile

:check             ## check the tally
 G                 ## pattern+=nl+hold
 /^.*\nx{5}$/{     ## we have the full complement of replacements
     b print       ## branch to print (and continue)
 }                 ##      
 s/^(.*)\n.*$//  ##
 s/ /;/            ## change one space (if one is present) 
 t inc-tally       ## branch_on_substitute
:print             ## no more spaces to change
 P                 ## pattern_first_line_print
 x;s/.*//;x        ## kill the accumulated tally chars in hold   
 b                 ## branch to end of proc (continue)
:inc-tally         ##      
 x                 ## swap_pattern_and_hold
 s/(.*)/x/       ##
 x                 ## swap_pattern_and_hold
 b check           ## branch_unconditional 
    
por 21.09.2011 / 17:46

Tags