Come inserire il testo prima della prima riga di un file?


Risposte:


102

Usa l sed' iopzione insert ( ) che inserirà il testo nella riga precedente.

sed '1 i\

Aggiornamento dell'autore della domanda:

Per farlo modificare il file sul posto - con GNU sed- ho dovuto aggiungere l' -iopzione:

sed -i '1 i\anything' file

Anche sintassi

sed  -i '1i text' filename

Per sed non GNU

Devi premere il tasto Invio immediatamente dopo la barra rovesciata 1i\e dopo first_line_text:

sed -i '1i\
first_line_text
'

Si noti inoltre che alcune sedimplementazioni non GNU (ad esempio quella su macOS) richiedono un argomento per il -iflag (usare -i ''per ottenere lo stesso effetto di GNU sed).


1
Non funziona senza -iopzione. Aggiornerò la tua risposta prima di accettare.
Manolo,

1
Grazie. Quale sistema operativo stai usando? La soluzione originale ha funzionato su OpenSuse 9.
suspectus

1
Interessante! Sono su Lubuntu 13.10 e sed '1 i\this text is entered above the existing first line' filelavora per me.

2
Qui, l'utilizzo ha sed (GNU sed) 4.2.2appena sed '1 i text to insert' -i filefunzionato come un fascino. Grazie
ton

1
@FeRD Vedi sotto la mia awkrisposta errata . Questo dovrebbe funzionare.
rudimeier

18

L'eco viene utilizzato per ottenere il testo. Cat nomefile: stampa il file nella console e> lo utilizza per inviare ad un altro file nomefile1 e quindi spostiamo il nomefile1 sul nomefile per ottenere il testo inserito nella prima riga del file desiderato.

  (echo "some text" && cat filename) > filename1 && mv filename1 filename

7
Per favore fatemi sapere perché è stato sottoposto a downgrade
Ankit Shah il

1
Forse perché l'OP menziona sed. A mio avviso, ciò non merita un voto negativo. Quella soluzione era anche la più adatta alle mie esigenze, quindi votata.
рüффп,

Ho votato. funziona su ksh per me.
arcee123,

17

Puoi usare Vim in modalità Ex:

ex -sc '1i|ALFA BRAVO' -cx file
  1. 1 seleziona la prima riga

  2. i inserisci testo e newline

  3. x salva e chiudi


7

Vuoi inserire del testo prima della prima riga anziché aggiungerlo dopo, quindi usa

sed '1 i\
your_text' your_file

Un documento qui può anche aiutare:

cat /dev/stdin your_file <<EOI
Your text
goes here
EOI

6

Usando GNU awk> = 4.1:

awk -i inplace 'BEGINFILE{print "first line"}{print}' foo.sh

Al contrario di tutte le sedrisposte, funziona anche su file vuoti.


inplaceè una libreria e sfortunatamente appare su tutte le distribuzioni awk che la spediscono. Ottengo "awk: fatal: impossibile aprire il file 'inplace' per la lettura"GNU Awk 4.2.1, API: 2.0 (GNU MPFR 4.0.1, GNU MP 6.1.2)
vossad01

6
sed  -i '1i new_text' file_name

Se non specifichi l' -iopzione, non mostrerà alcun errore e visualizzerà l'output sul terminale standard, ma non inserirà il testo nel file.


La domanda non riguarda l' -iinterruttore.
don_crissti,

Come lo pensi? Si tratta di una risposta alla domanda. Sì, è simile alla risposta accettata, ma non è esattamente la stessa.
G-Man

@G-Man - si potrebbe sostenere che il modello utilizzato da cas è tutt'altro che ideale ma in realtà, questo è simile come in quasi identico ... la differenza è la spaziatura e il fatto che questo non ha una barra rovesciata. Per quanto mi riguarda sono tecnicamente identici (in quanto sono entrambi gnu sedspecifici e succede che gnu sedaccetteranno isenza una barra rovesciata). Se gli altri pensano che questo meriti una risposta separata + un voto ... vabbè.
don_crissti,

2

Il 0acomando che si è tentato non lavora in ex, il predecessore divi :

printf '%s\n' 0a 'Anything you want to add' . x | ex file.txt

Il printfcomando da solo genera:

0a
Anything you want to add
.
x

Il 0amezzo si aggiunge dopo la 0a riga (cioè prima della prima riga).

La riga successiva o più righe è il testo letterale da aggiungere.

L' .accensione di una riga termina da sola il comando "aggiungi".

In questo xmodo Ex salva le modifiche al file ed esce.


1

Sono sorpreso che in questa vecchia domanda nessuno abbia mostrato il comando sed più comune (e abbastanza semplice in questo caso):

$ sed  -i '1s/^/new_text\
/' file_name

Funziona nella maggior parte delle shell ed è portatile per diverse versioni sed.
Se GNU sed è disponibile, è possibile utilizzare questo:

$ sed -i '1s/^/new_text\n' file_name

La differenza è che GNU sed consente l'uso di a \nper una nuova riga e altri hanno bisogno di una nuova riga letterale preceduta da una barra rovesciata (che funziona comunque anche con GNU sed).

Se $'…'è in uso una shell che accetta la sintassi, è possibile inserire direttamente la nuova riga, quindi sed vede che la nuova riga è già presente:

$ sed -i $'1s/^/new_text\\\n/' file_name

Che funziona per più versioni sed.


-1

Sfortunatamente, tutte le risposte sopra (principalmente con sed) non hanno funzionato per me poiché hanno sostituito la prima riga. Sono su una Ubuntu 16.04 LTSmacchina. Ecco la mia soluzione alternativa con GNU Awk 4.0.2:

awk '{if(NR==1){$0="NEW_FIRST_LINE"$0; print $0} ;if(NR!=1){print $0}}' file_name

1
Non sono sicuro di cosa stai parlando ... C'è solo una sedrisposta che utilizza la sostituzione ma non sostituisce la linea esistente.
don_crissti,

-2

Primo e ultimo

Suppongo che chiunque abbia cercato come inserire / aggiungere testo all'inizio / alla fine di un file probabilmente deve anche sapere come fare anche l'altro.

cal |                            \
  gsed -E                        \
       -e     '1i\{'             \
       -e     '1i\  "lines": ['  \
       -e 's/(.*)/    "\1",/'    \
       -e '$s/,$//'              \
       -e     '$a\  ]'           \
       -e     '$a\}'

Spiegazione

Questo viene calinviato a gnu- sed(chiamato gsedsu macOS installato tramite brew.sh ) con RegEx esteso ( -E) e 6 "script" applicati ( -e) e interruzioni di riga con escape \per leggibilità. Gli script 1 e 2 usano 1i\per "alla riga 1, inserire". Gli script 5 e 6 usano $a\"alla riga <lasto>, aggiungi". Ho allineato verticalmente gli output del testo per fare in modo che il codice rappresentasse ciò che è previsto nel risultato. Gli script 3 e 4 sostituiscono (quest'ultimo si applica solo a "line <last>"). Il risultato sta convertendo l'output del comando in JSON valido.

produzione

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

Anche se non ho votato sulla tua domanda, nota che abbiamo già diverse risposte, tra cui una accettata, che dimostrano il risultato desiderato.
Jeff Schaller

@JeffSchaller La community di Stack Exchange non è un forum. Il suo scopo si estende oltre ad aiutare a sbloccare l'OP. L'obiettivo è seminare la base di conoscenza globale con molte opzioni su cui i ricercatori possono imbattersi nella ricerca di risposte. Il motivo per cui ho intitolato la mia risposta è aiutare gli utenti a riconoscere l'utilità di questa risposta prima ancora di fare clic sul risultato di Google.
Bruno Bronosky,

Quello che sto dicendo è che la tua risposta non fornisce nuove opzioni (risposte) per i futuri lettori di questa domanda. Abbiamo già quattro risposte che utilizzano le varianti di 1iper inserire il testo prima della prima riga. Qualcuno con questa domanda dovrebbe estrarre le parti di cui hanno bisogno dalla tua risposta per risolvere il loro problema. Le domande sono gratuite, quindi ti invito a porre e rispondere alla tua domanda per fornire la tua risposta specifica.
Jeff Schaller
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.