Come posso scrivere sulla seconda riga di un file dalla riga di comando?


29

Ho un programma esterno che produce un file di output (larghe, 20K righe possibili).

Devo inserire una nuova riga tra la riga 1 e la riga 2. Ho esaminato awk e sed - uso una fodera in ciascuna abbastanza regolarmente - ma non sono riuscito a trovare gli interruttori giusti per Fai questo.

Risposte:


20
awk 'NR==1{print; print "new line"} NR!=1'

12
Un po 'più corto:awk 'NR==2 {print "new line"} 1'
Glenn Jackman,

@glennjackman: la tua versione non funziona sul mio sistema, ma la risposta funziona. In particolare, con i tuoi, la riga 2 viene duplicata e la nuova riga viene inserita tra entrambi (così come la riga 3).
Nikana Reklawyks,

C'è un modo per iniziare a scrivere alla seconda riga e sovrascrivere tutte le righe successive?
CMCDragonkai,

@CMCDragonkai Non sono sicuro di cosa tu stia chiedendo. Basta stampare la prima riga del file specificato e una seconda riga impostata? Prima riga e poi il contenuto di un file? La prima riga del primo file e quindi una riga di un secondo file per ogni riga rimanente nel primo? Potresti voler fare una nuova domanda con una descrizione molto specifica di ciò che desideri e un esempio relativamente breve ma completo.
Kevin,

16

Per il tuo caso specifico, questo dovrebbe essere più semplice:

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

Spiegazione: alla riga 1 , procedere come segue

  1. P Rint linea
  2. E x cambia lo spazio del modello con lo spazio di mantenimento (sostanzialmente svuota il buffer)

Quindi, la riga (vuota ora) viene nuovamente stampata come parte del ciclo.


Se vuoi aggiungere una nuova riga anziché un nuovo carattere di linea (cosa ho capito inizialmente), usa semplicemente sedil comando a\(append):

sed '1 a\
appended line' your-file

o anche

sed '1 aappended line' your-file

Aggiunge " appended line" dopo la riga 1.


1
sed -i '1 a\\' filesolo per una newline.
forcefsck,

1
@forcefsck Sì, l'unico svantaggio è che si tratta di un GNUismo, come il mio secondo '1 aapended line'esempio.
angus,

8

Immagino che l' sedapproccio sarebbe:

sed '2 i whatever_line_of_text_you_wanted_to_INSERT' filename.txt

Ciò porterà il testo nella seconda riga del file e quindi la seconda riga effettiva nel file diventerà la terza.

Nota che, usando la modalità append , se doveva essere, doveva usare la prima riga, poiché l'appendice avverrà dopo il numero di riga annotato.

sed '1 a whatever_line_of_text_you_wanted_to_INSERT' filename.txt



2

Questo potrebbe funzionare per te:

sed 1G file

Se si desidera inserire somethingdopo la nuova riga:

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

O se si gestisce \n:

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

Certo aè ancora più semplice:

sed '1a something' file

Mi dispiace, che cosa fa?
Nikhil Mulley,

Inserisce una nuova riga dopo la riga 1
potong

1
O meglio aggiunge una nuova riga \nalla prima riga!
potong

1

Di solito lo uso edper questo:

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

Simile a una sedsoluzione, ma senza il disordine delle newline sfuggite.


2
Si potrebbe risparmiare alcuni echo's, specialmente sotto bash: ed - filename <<< $'1a\nLine to insert\n.\nw'.
arte

1
Non funziona in tutte le shell, ad esempio dash, in molti sistemi /bin/sh.
Arcege,

1
Ecco perché ho scritto "Potresti risparmiarne alcuni echo ". Risparmiando tutto echo s' è davvero bashunica caratteristica, ma riducendo il echoconteggio da 4 a 1 opere in dashe kshtroppo: echo '1a\nLine to insert\n.\nw' | ed - filename.
arte

1
O semplicemente usaprintf %s\\n , che mette una nuova riga dopo ogni argomento che le dai e non rovina i caratteri speciali incorporati nella riga che vuoi inserire. Inoltre, perché usare edquando exè disponibile?
Carattere jolly

1

Soluzione Python

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

0

Utilizzo sede codici di escape ANSI (specifici per Bash):

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

0

vorrei usare Python per questo

import fileinput

for linenum,line in enumerate(fileinput,FileInput("file",inplace=1)):
    if linenum ==1:
          print ""
          print line.rstrip() 
      else: 
          print line.rstrip()`

0

Mi piace solo usare un contatore esplicito:

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

0

Il metodo più semplice utilizza printfe ex:

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

1asignifica "aggiungi dopo la prima riga"; il .termina l'aggiunta; xsignifica salvare ed uscire.


0

Nessuna delle risposte sopra menzionate menziona come salvare le modifiche al file originale, cosa che penso sia ciò che l'OP stava chiedendo.

È certamente quello di cui avevo bisogno quando mi collegavo alla pagina.

Supponendo quindi che il tuo file sia chiamato output.txt

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

Il mio caso d'uso particolare è quello di aggiungere automaticamente una dichiarazione del foglio di stile xsl a un file xml junit.

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

yourownlinux.com/2015/04/… è la parte rilevante di un'introduzione ben scritta a sed.
chim
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.