
O seguinte método de inserção de arquivo costumava sed
funcionar, 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 sed
você 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 ,p
por w
se 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 ed
lê, file
o endereço atual é definido para a última $
linha. -
(ou -1
) define o endereço atual para uma linha antes (ou seja, $-1
) e r
lê insert.txt
depois da linha atual. ,p
imprime o conteúdo do buffer de texto (como eu disse, substitua por w
para salvar as alterações) e q
sai 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 i
a 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 cat
o e inserted_file.txt
, em seguida, exibir a última linha do arquivo first_file.txt
.