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?


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.


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

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


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

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.


-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        ",
    "                      "
  ]
}

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.