O uso do comando “a” do sed para prefixar uma linha portátil?

3

Eu notei o seguinte comportamento interessante:

$ printf '%s\n' line{1..2} | sed $'1a\\nPREFIX'
line1
PREFIXline2
$ 

Curiosamente, este comportamento só é possível para o comando last em um script Sed, pois colocar outro comando depois requer uma nova linha.

Também funciona com o comando insert:

$ printf '%s\n' line{1..2} | sed $'1i\\nPREFIX'
PREFIXline1
line2
$ 

Esse comportamento pode depender?

Não vejo isso mencionado de uma forma ou de outra nas especificações POSIX para Sed . Apenas diz que o text pode consistir em uma ou mais linhas. (Se uma linha não termina em um caractere de nova linha, ainda é uma linha?)

Também funciona com várias inserções de linha:

$ printf '%s\n' line{1..2} | sed $'1a\\n ****/\n1i\\n/****\\n * '
/****
* line1
****/
line2
$ 
    
por Wildcard 07.09.2017 / 05:37

2 respostas

0

Acabei de testar com um Sed diferente e descobri que isso é uma peculiaridade do BSD Sed; O GNU Sed fornece resultados diferentes melhor ilustrados com a saída do último comando dado acima:

$ printf '%s\n' line{1..2} | sed $'1a\\n ****/\n1i\\n/****\\n * '
/****
 *
line1
 ****/
line2
$
    
por 07.09.2017 / 05:39
0

Para prefixar uma linha com uma string, use uma substituição ( s ) e substitua ^ , a âncora de início da linha:

$ printf 'line1\nline2\n' | sed '1s/^/PREFIX/'
PREFIXline1
line2

Use a para acrescentar linhas depois de alguma linha e i para inserir uma linha antes de outra linha. Os comandos a e i não servem para modificar linhas, apenas adicionando linhas.

"Esse comportamento pode depender?" Não. Como Stéphane Chazelas aponta nos comentários, "Isso é claramente um bug", e o GNU sed não mostra o comportamento descrito.

Com relação à sua pergunta "Se uma linha não terminar em um caractere de nova linha, ainda é uma linha?", POSIX define uma" linha "como

A sequence of zero or more non-<newline> characters plus a terminating <newline> character.

Então a resposta para essa pergunta é "não, não é uma linha".

    
por 28.09.2017 / 20:29