Usando sed para substituir a primeira correspondência em um arquivo - por que linhas subsequentes são impressas?

2
$ cat rgb
lower (#1): "red green blue"
UPPER (#2): "RED GREEN BLUE"

$ sed '/#/ {s//=/; :k n; bk}' rgb
lower (=1): "red green blue"
UPPER (#2): "RED GREEN BLUE"

Eu sei que sed sai sem autoprint se não houver nenhuma linha a ser anexada. No entanto, neste exemplo, sed imprimiu a última linha. Como isso funciona?

    
por Smile 11.01.2018 / 11:21

1 resposta

2
'n'
     (next) If auto-print is not disabled, print the pattern space,
     then, regardless, replace the pattern space with the next line of
     input.  If there is no more input then 'sed' exits without
     processing any more commands.

A opção -n desativa a autoprint.

Você substituiu # por = na primeira linha com # (o espaço padrão). O espaço padrão foi impresso por n porque não havia a opção -n . Em seguida, o espaço de padrão foi substituído pela próxima linha, em seguida, passamos para n , o que causou a impressão do espaço de padrão porque a autoprint não foi desativada e, em seguida, não houve mais linhas de entrada, portanto sed . / p>

Talvez seja mais claro usar -n e adicionar p ao seu loop:

$ sed -n '/#/ {s//=/; :k n;p; bk}' rgb
UPPER (#2): "RED GREEN BLUE"

após n , p forçar a impressão de todos, exceto da primeira linha.

$ sed -n '/#/ {s//=/; :k p;n; bk}' rgb
lower (=1): "red green blue"
UPPER (#2): "RED GREEN BLUE"

antes de n , p força o espaço de padrão a ser impresso toda vez. n nunca imprime nada, porque a autoprint está desativada.

Tente remover a opção -n com o comando p em posições diferentes no loop.

Se você quiser imprimir apenas uma linha depois de alterá-la, use q :

$ sed '/#/ s//=/;q' rgb
lower (=1): "red green blue"
    
por Zanna 11.01.2018 / 11:51