Como escrever na segunda linha de um arquivo na linha de comando?

29

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

Preciso inserir uma nova linha entre a linha 1 e a linha 2. Já estive observando awk e sed - eu uso liners em cada uma com bastante regularidade - mas não consegui encontrar as opções certas para fazem isto.

Tim Brigham
fonte

Respostas:

20
awk 'NR==1{print; print "new line"} NR!=1'
Kevin
fonte
12
Um pouco mais curto:awk 'NR==2 {print "new line"} 1'
glenn jackman
@glennjackman: sua versão não funciona no meu sistema, mas a resposta funciona. Especificamente, com a sua, a linha 2 é duplicada e a nova linha é inserida entre as duas (assim como a linha 3).
Nikana Reklawyks
Existe uma maneira de começar a escrever na segunda linha e substituir todas as linhas subseqüentes?
precisa saber é o seguinte
@CMCDragonkai Não sei bem o que você está pedindo. Basta imprimir a primeira linha do arquivo especificado e uma segunda linha definida? Primeira linha e depois o conteúdo de um arquivo? A primeira linha do primeiro arquivo e, em seguida, uma linha de um segundo arquivo para cada linha restante no primeiro? Você pode fazer uma nova pergunta com uma descrição muito específica do que deseja e um exemplo relativamente curto, mas completo.
Kevin
16

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 Rint a linha
  2. E x alterar o espaço do padrão com o espaço de espera (basicamente esvazia o buffer)

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


Se você deseja adicionar uma nova linha em vez de um novo caractere de linha (o que eu entendi inicialmente), basta usar sedo comando a\(anexar):

sed '1 a\
appended line' your-file

ou mesmo

sed '1 aappended line' your-file

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

angus
fonte
1
sed -i '1 a\\' filepor apenas uma nova linha.
forcefsck
1
@forcefsck Sim, a única desvantagem é que é um GNUism, como meu segundo '1 aapended line'exemplo.
Angus
8

Eu acho que a sedabordagem 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.

Observe que, no modo de acréscimo , se necessário, ele deve usar a primeira linha, pois o acréscimo ocorrerá após o número da linha anotado.

sed '1 a whatever_line_of_text_you_wanted_to_INSERT' filename.txt

Nikhil Mulley
fonte
3
sed ':a;N;$!ba;s/\n/\n\n\n/' yourBigFile

Explicação.

Abhijeet Rastogi
fonte
2

Isso pode funcionar para você:

sed 1G file

Se você deseja inserir somethingapós a nova linha:

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

Ou se você sed lida com \n:

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

Claro que aé ainda mais fácil:

sed '1a something' file
potong
fonte
Me desculpe, o que isso faz?
precisa saber é o seguinte
Ele insere uma nova linha após a linha 1
Potong
1
Ou melhor, acrescenta uma nova \nlinha à linha um!
Potong
1

Eu costumo usar edpara isso:

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

Semelhante a uma sedsolução, mas sem a confusão de novas linhas de escape.

Arcege
fonte
2
Você poderia poupar alguns echo's, especialmente sob bash: ed - filename <<< $'1a\nLine to insert\n.\nw'.
manatwork
1
Não funciona em todos os shells, por exemplo dash, em muitos sistemas /bin/sh.
Arcege 28/01/12
1
Foi por isso que escrevi "Você pode poupar alguns echo ". Poupando todos echo 's é realmente bashúnica característica, mas reduzindo a echocontagem de 4 a 1 obras em dashe kshtambém: echo '1a\nLine to insert\n.\nw' | ed - filename.
manatwork
1
Ou apenas useprintf %s\\n , que coloca uma nova linha após cada argumento que você dá e não estraga caracteres especiais incorporados na linha que você deseja inserir. Além disso, por que usar edquando exestá disponível?
Curinga
1

Solução Python

python -c "import sys; lines = sys.stdin.readlines(); lines.insert(1,'New Line\n'); print ''.join(lines).strip()" < input.txt
Rahul Patil
fonte
0

Usando sedcódigos de escape ANSI (específicos da Bash):

# note: \ --> \\
printf '%s\n' 1 2 3 4 5 | sed -e $'1 { s/\\(.*\\)/\\1\\\ninserted line/; }'
topi
fonte
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()`
harish.venkat
fonte
0

Eu apenas gosto de usar um contador explícito:

awk '(c==1) {print "new line"} (c!=1) {print $0} {c++}' file
Professor Awk
fonte
0

O método mais simples usa printfe ex:

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

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

Curinga
fonte
0

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

Certamente é o que eu preciso quando vou para a página.

Então, supondo que 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
chim
fonte
yourownlinux.com/2015/04/… é a parte relevante de uma introdução bem escrita ao sed.
chim