sed, insira o arquivo antes da última linha

sed, insira o arquivo antes da última linha

O seguinte método de inserção de arquivo costumava sedfuncionar, mesmo antes da última linha, mas não mais. É um bug no atual sed?

Demonstração do método de inserção de arquivo com sed:

mkdir /tmp/test
printf '%s\n' {1..3} > /tmp/test/f1
printf '%s\n' {one,two,three,four,five,six,seven,eight,nine,ten} > /tmp/test/f2

$ cat /tmp/test/f2 | sed -e "/nine/r /tmp/test/f1" -e //N
one
two
three
four
five
six
seven
eight
1
2
3
nine
ten

$ head -9 /tmp/test/f2 | sed -e "/nine/r /tmp/test/f1" -e //N
one
two
three
four
five
six
seven
eight
nine
1
2
3

$ cat /tmp/test/f2 | sed -e "/ten/r /tmp/test/f1" -e //N
one
two
three
four
five
six
seven
eight
nine
ten
1
2
3

$ sed --version
GNU sed version 4.2.1
... 

Ou seja, o método de inserção de arquivo antes da linha funciona em qualquer lugar, exceto na última linha. Costumava estar funcionando antes. É um bug no atual sed?

Obrigado

Responder1

Já que você está ligado, gnu sedvocê poderia usar

'e [COMMAND]'
     This command allows one to pipe input from a shell command into
     pattern space.

na última $linha:

sed '$e cat insert.txt' file

Com ed(substitua ,ppor wse desejar editar no local):

ed -s file<<IN
- r insert.txt
,p
q
IN

ou

ed -s file <<< $'-1 r insert.txt\n,p\nq\n'

Quando edlê, fileo endereço atual é definido para a última $linha. -(ou -1) define o endereço atual para uma linha antes (ou seja, $-1) e rinsert.txtdepois da linha atual. ,pimprime o conteúdo do buffer de texto (como eu disse, substitua por wpara salvar as alterações) e qsai do editor.

Responder2

De acordo com o seu comentário você "TEM QUEpartida contra a última linha", então eu consideraria usar $(última linha) e i(comando de inserção) em sed. Por exemplo:

sed '$ i\INSERT BEFORE LAST LINE' number.txt
1
2
3
4
INSERT BEFORE LAST LINE
5

Apenas certifique-se de que o arquivo não tenha uma linha vazia como última linha e deve funcionar. Observe o espaço entre o cifrão e ia barra invertida ( \) após o i. Isso irá inserir o texto após a barra invertida na última linha sem a necessidade de a /pattern/para a última linha.

NOTA: Este comando adicionará apenas uma linha de texto antes da linha final, não um arquivo. Se você deseja inserir o conteúdo de um arquivo antes da última linha.

Se você quiser adicionar um arquivo inteiro (e não o faz se estiver em sed), eu usaria isto:

    head -n-1 first_file.txt && cat inserted_file.txt && tail -n1 first_file.txt 

Isso deve exibir tudo, exceto a última linha, depois cato e inserted_file.txt, em seguida, exibir a última linha do arquivo first_file.txt.

informação relacionada