SED: inserire il testo dopo l'ultima riga?


77

Il comando inserisce un tag all'inizio di un file:

sed -i "1s/^/<?php /" file

Come posso inserire qualcosa alla fine di ogni file con SED?


3
{ cat file; echo 'END OF FILE'; } > newFile , questo funziona anche grazie a sh. *. (non sed ma funziona e semplice)

4
un semplice echo "Cool Text" >> filedovrebbe anche fare il trucco.
Danpe,

Risposte:


95

sed -e "\$aTEXTTOEND" è il modo più semplice.

Come funziona

$corrisponde all'ultima riga (è un sedindirizzo normale ; 4aTEXTTOENDinserirà dopo la quarta riga), aè il comando append ed TEXTTOENDè cosa aggiungere.


Fuga $ come $$ in un Makefile.
Stevesliva,

Per OS X sed -e '$a\NEWLINE\\'. Sostituisci NEWLINE con una nuova linea reale.
Jorge Bucaran,

15
sed -i -e "\ $ aTEXTTOEND" <nomefile> sarebbe il comando completo.
Lasse Meyer,

2
non funziona su macos. Nemmeno il commento di Jorge Bucaran: sed: 1: "$ a \ NEWLINE \\": caratteri extra dopo \ alla fine di un comando
Emanuele Paolini,

1
In Debian 9 aggiunge una nuova riga invece di aggiungere alla fine dell'ultima riga.
Luciano Andress Martini,

31

Non c'è bisogno di usare sedin quel caso. Che ne dite di

echo "<?php" >> file

2
Abbastanza vero, ma puoi indovinare che il caso d'uso dell'OP sta racchiudendo il file tra " <php " e " >" e citando i contenuti selezionati tutto in una volta, quindi probabilmente vuole davvero un sedframmento.
dmckee,

2
Inoltre, se lo fai e non vuoi una nuova riga, usa echo -n
Vinko Vrsalovic,

2
Non mi piace indovinare. Ogni volta che ci provo, mi sbaglio.

4
Un altro motivo per cui la risposta accettata è più utile è nel caso di anteporre a questo sudo, il che fa fallire questa variazione poiché echoè un comando di shell incorporato piuttosto che un file eseguibile trovato in$PATH
Tony Cesaro,

@TonyCesaro: echoè un built-in ma è anche un file eseguibile trovato in$PATH
Zan Lynx,

24

Supponendo di voler inserire il tag php finale nei file, quindi

sed -i '$s/$/\n?>/' file

dovrebbe fare il trucco


1
Funziona bene nei casi in cui si desidera una manipolazione arbitraria dell'ultima riga di input. Grazie!
Jay Taylor,

Una spiegazione scomposta del comando sarebbe molto apprezzata
GGhe


3

Usa il comando sed 'append (a)'. Ad esempio, per aggiungere due righe alla fine del file:

sed -i -e '$a\
foo1 bar1\
foo2 bar2' file

2

In un modo semplice per scrivere e apportare le modifiche al contenuto in una riga specifica in un file. Se si desidera inserire qualcosa in un numero di riga specifico, è possibile utilizzare il comando seguente:

sed -i '2i i have started' sheikh.log

dove 2i- la riga numero 2 e i indica l'inserimento. Se è necessario inserire l'ultima riga, utilizzare $al posto di 2. ho iniziato - il testo da inserire ed sheikh.logè il nome file.

Possiamo anche apportare le modifiche alla riga usando il comando seguente

sed -i '2c we have started' sheikh.log

iè cambiato in we.


-1

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,
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.