Como posso escrever na segunda linha de um arquivo a partir da linha de comando?

26

Eu tenho um programa externo que produz um arquivo de saída (largish, 20K linhas possíveis).

Eu preciso inserir uma nova linha entre a linha 1 e a linha 2. Eu estive olhando para o awk e o sed - eu uso um dos liners em cada um regularmente - mas eu não consegui encontrar o certo muda para fazer isso.

    
por Tim Brigham 23.01.2012 / 17:41

12 respostas

20
awk 'NR==1{print; print "new line"} NR!=1'
    
por 23.01.2012 / 18:30
14

Para o seu caso específico, isso deve ser mais simples:

sed '1 { P ; x }' your-file

Explicação: na linha 1 , faça o seguinte

  1. P retire a linha
  2. E x altera o espaço do padrão com o espaço de retenção (basicamente esvazia o buffer)

Em seguida, a linha (vazia agora) é impressa novamente como parte do ciclo.

Se você quiser adicionar uma nova linha em vez de um novo caractere de linha (o que eu entendi inicialmente), use o comando sed a\ ( acrescentar):

sed '1 a\
appended line' your-file

ou até mesmo

sed '1 aappended line' your-file

Acrescenta " appended line " após a linha 1.

    
por 23.01.2012 / 18:31
6

Eu acho que a abordagem sed seria:

sed '2 i whatever_line_of_text_you_wanted_to_INSERT' filename.txt

Isso colocará o texto na segunda linha do arquivo e a segunda linha real no arquivo se tornará a terceira.

Note que, usando o modo append , se tivesse que ser, ele teria que usar a primeira linha, já que o acréscimo acontecerá após o número da linha ser anotado.

sed '1 a whatever_line_of_text_you_wanted_to_INSERT' filename.txt

    
por 28.01.2012 / 09:23
3
sed ':a;N;$!ba;s/\n/\n\n\n/' yourBigFile

Explicação.

    
por 23.01.2012 / 18:19
2

Isso pode funcionar para você:

sed 1G file

Se você deseja inserir something após a nova linha:

sed '1{G;s/$/something/}' file

Ou se sed processar \n :

sed '1s/$/\nsomething/' file

É claro que a é ainda mais fácil:

sed '1a something' file
    
por 26.01.2012 / 15:08
1

Solução Python

python -c "import sys; lines = sys.stdin.readlines(); lines.insert(1,'New Line\n'); print ''.join(lines).strip()" < input.txt
    
por 19.09.2013 / 14:21
0

Usando os códigos de escape ANSI sed e (específicos do Bash):

# note: \ --> \
printf '%s\n' 1 2 3 4 5 | sed -e $'1 { s/\(.*\)/\1\\ninserted line/; }'
    
por 27.01.2012 / 11:51
0

Eu costumo usar ed para isso:

(echo 1a; echo 'Line to insert'; echo .; echo w) | ed - filename

Semelhante a uma solução sed , mas sem a desordem de novas linhas escapadas.

    
por 28.01.2012 / 16:21
0

eu usaria python para isso

import fileinput

for linenum,line in enumerate(fileinput,FileInput("file",inplace=1)):
    if linenum ==1:
          print ""
          print line.rstrip() 
      else: 
          print line.rstrip()'
    
por 23.01.2012 / 18:35
0

Eu apenas gosto de usar um contador explícito:

awk '(c==1) {print "new line"} (c!=1) {print $0} {c++}' file
    
por 04.02.2012 / 22:51
0

O método mais simples usa printf e ex :

printf '%s\n' 1a 'my line to insert' . x | ex file

1a significa "acrescentar após a primeira linha"; o . termina o anexo; x significa salvar e sair.

    
por 12.04.2016 / 03:52
0

Nenhuma das respostas acima menciona como salvar as alterações no arquivo original, que é o que o OP estava pedindo.

É certamente o que eu precisava ao acessar a página.

Supondo que o seu arquivo seja chamado output.txt

sed -i '1 a This is the second line' output.txt

Meu caso de uso específico é adicionar automaticamente uma declaração de folha de estilo xsl a um arquivo xml junit.

sed -i '1 a <?xml-stylesheet type="text/xsl" href="junit-html.xsl"?>' junit.xml
    
por 16.06.2016 / 12:08