awk 'NR==1{print; print "new line"} NR!=1'
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.
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
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.
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
sed ':a;N;$!ba;s/\n/\n\n\n/' yourBigFile
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
Solução Python
python -c "import sys; lines = sys.stdin.readlines(); lines.insert(1,'New Line\n'); print ''.join(lines).strip()" < input.txt
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/; }'
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.
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()'
Eu apenas gosto de usar um contador explícito:
awk '(c==1) {print "new line"} (c!=1) {print $0} {c++}' file
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.
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
Tags text-processing awk sed