SED: insere texto após a última linha?

77

O comando insere uma tag no início de um arquivo:

sed -i "1s/^/<?php /" file

Como posso inserir algo no final de cada arquivo com o SED?

don_crissti
fonte
3
{ cat file; echo 'END OF FILE'; } > newFile , isso também funciona graças a sh. *. (não sed, mas funciona e é simples)
4
um simples echo "Cool Text" >> filetambém deve fazer o truque.
Danpe

Respostas:

95

sed -e "\$aTEXTTOEND" é a maneira mais simples.

Como funciona

$corresponde à última linha (é um sedendereço normal ; 4aTEXTTOENDseria inserido após a quarta linha), aé o comando append e TEXTTOENDé o que acrescentar.

bseller
fonte
Escape $ as $$ em um Makefile.
Steveliva
Para OS X sed -e '$a\NEWLINE\\'. Substitua NEWLINE por uma nova linha real.
Jorge Bucaran 18/10/2015
15
sed -i -e "\ $ aTEXTTOEND" <nome do arquivo> seria o comando completo.
Lasse Meyer
2
não está trabalhando em macos. Nem mesmo Jorge Bucaran comenta: sed: 1: "$ a \ NEWLINE \\": caracteres extras após \ no final de um comando
Emanuele Paolini 15/18
1
No debian 9, ele adiciona uma nova linha ao invés de adicionar no final da última linha.
Luciano Andress Martini
31

Não há necessidade de usar sednesse caso. E se

echo "<?php" >> file
innaM
fonte
2
É verdade, mas você pode adivinhar que o caso de uso do OP está agrupando o arquivo com " <php " e " >" e citando o conteúdo selecionado de uma só vez, então ele provavelmente realmente quer um sedfragmento.
dmckee
2
Além disso, se você vai fazer isso e não querem uma nova linha, use echo -n
Vinko Vrsalovic
2
Eu não gosto de adivinhar. Cada vez que tento, estou errado.
4
Outra razão pela qual a resposta aceita é mais útil é o caso de anexá-la sudo, o que causa uma falha nessa variação, já que echoé um comando shell interno, e não um arquivo executável encontrado em$PATH
Tony Cesaro
@TonyCesaro: echoé um arquivo interno, mas também é um arquivo executável encontrado em$PATH
Zan Lynx
24

Supondo que você queira colocar a tag php final nos arquivos,

sed -i '$s/$/\n?>/' file

deve fazer o truque

Vinko Vrsalovic
fonte
1
Isso funciona bem nos casos em que a manipulação arbitrária da última linha de entrada é desejada. Obrigado!
Jay Taylor
Uma explicação decomposta do comando seria muito apreciada
GGhe
3

Use o comando sed 'append (a)'. Por exemplo, para acrescentar duas linhas no final do arquivo:

sed -i -e '$a\
foo1 bar1\
foo2 bar2' file
user2802945
fonte
2

De uma maneira simples, para escrever e fazer as alterações no conteúdo em uma linha específica de um arquivo. Se você deseja inserir algo em um número de linha específico, o comando abaixo pode ser usado:

sed -i '2i i have started' sheikh.log

onde 2i- a linha número 2 e i significa inserção. Se você precisar inserir a última linha, use $no lugar de 2. eu comecei - o texto a ser inserido e sheikh.logé o nome do arquivo.

Também podemos fazer as alterações na linha usando o comando abaixo

sed -i '2c we have started' sheikh.log

ié alterado para we.

Sheik Mohammed Abdulla
fonte
-1

Primeiro e último

Eu diria que qualquer um que tenha pesquisado como inserir / anexar texto ao início / fim de um arquivo provavelmente também precisará saber como fazer o outro.

cal |                            \
  gsed -E                        \
       -e     '1i\{'             \
       -e     '1i\  "lines": ['  \
       -e 's/(.*)/    "\1",/'    \
       -e '$s/,$//'              \
       -e     '$a\  ]'           \
       -e     '$a\}'

Explicação

Isso é calenviado para o gnu- sed(chamado gsedno macOS instalado via brew.sh ) com RegEx ( -E) estendido e 6 "scripts" aplicados ( -e) e as quebras de linha são escapadas \para facilitar a leitura. Os scripts 1 e 2 usam 1i\"na linha 1, insira". Os scripts 5 e 6 costumam $a\"na linha <último>, acrescentar". Alinhei verticalmente as saídas de texto para fazer o código representar o que é esperado no resultado. Os scripts 3 e 4 fazem substituições (o último se aplica somente à "linha <última>"). O resultado é a conversão da saída do comando para JSON válido.

resultado

{
  "lines": [
    "    October 2019      ",
    "Su Mo Tu We Th Fr Sa  ",
    "       1  2  3  4  5  ",
    " 6  7  8  9 10 11 12  ",
    "13 14 15 16 17 18 19  ",
    "20 21 22 23 24 25 26  ",
    "27 28 29 30 31        ",
    "                      "
  ]
}
Bruno Bronosky
fonte
Embora eu não tenha votado em sua pergunta, observe que já temos várias respostas, incluindo uma aceita, que demonstram o resultado desejado.
Jeff Schaller
@JeffSchaller A comunidade Stack Exchange não é um fórum. Seu objetivo vai além de ajudar o OP a ser desbloqueado. O objetivo é propagar a base de conhecimento global com muitas opções que os candidatos podem encontrar ao procurar respostas. O motivo pelo qual intitulei minha resposta é ajudar os usuários a reconhecerem a utilidade dessa resposta antes mesmo de clicarem no resultado do Google.
Bruno Bronosky 22/10