Come inserisco una riga nella parte superiore di un file di testo usando la riga di comando?


25

Voglio inserire del testo nella parte superiore di un file già esistente. Come posso raggiungere questo obiettivo. Ci ho provato echoe teenon ci sono riuscito.

Stavo cercando di inserire una riga di repo nella parte superiore del sources.listfile dal terminale.

Nota

Ho bisogno di una soluzione rapida di una riga, perché il metodo di un'altra risposta mi era già noto


1
tee aggiunge una riga nella parte inferiore del file, ad esempio echo "deb http://extras.ubuntu.com/ubuntu precise main" | sudo tee -a /etc/apt/sources.list- è necessario anche sudo prima di ottenere i privilegi di amministratore. Ma perché mai vorresti aggiungere qualcosa in cima a sources.list?
Savvas Radevic,

2
@medigeek: da qualche parte nella storia delle domande del PO troverai qualcosa sull'installazione / aggiornamento da un repository CD ... Sospetto che possa essere la ragione ...
ish

Grazie a @izx, il tuo presupposto è corretto. Sono abbastanza impressionato. Puoi anche rispondere a questa domanda. Si trattava di installare da un repository locale utilizzando il software-center e anche impostare il repository locale per la massima priorità senza metterlo in cima. Grazie ancora.
Anwar,

1
@izx, ecco il link per impostare la massima priorità sul mio repository locale. Sarò felice se puoi anche controllare questa domanda sul centro software . Grazie ancora per il tuo primo commento. è stato molto contento.
Anwar,

1
@medigeek, puoi vedere questa domanda per la spiegazione di una domanda così insolita.
Anwar,

Risposte:


38

In realtà è abbastanza facile con sed:

  • sed -i -e '1iHere is my new top line\' filename

  • 1idice a sed di inserire il testo che segue alla riga 1 del file; non dimenticare la \nuova riga alla fine in modo che la riga 1 esistente venga spostata sulla riga 2.


1
Grazie. Solo per la nota: se si desidera sostituire, invece di inserire use sanziché i in 1i.
Anwar,

3
Purtroppo questo fallisce per il file vuoto (non ha una linea di pugno, quindi sed non si inserisce mai).
Tino,

@Tino Per file vuoti puoi semplicemente usareecho "Text Here" >> Filename
Flotolk il

non funziona su MacOS 10
Krishna il

7

In generale, la modifica in posizione con uno script è difficile, ma è possibile utilizzare echoe catpoimv

echo "fred" > fred.txt
cat fred.txt t.txt >new.t.txt
# now the file new.t.txt has a new line "fred" at the top of it
cat new.t.txt
# can now do the rename/move
mv new.t.txt t.txt

Tuttavia, se stai giocando con sources.list devi aggiungere un po 'di convalida e prove di proiettile per rilevare errori ecc. Perché non vuoi davvero perdere questo. Ma questa è una domanda separata :-)


Posso già farlo. Ho bisogno di una soluzione a una linea come ha dato izx. comunque grazie per la tua risposta.
Anwar,

1
@AnwarShah - ah scusa! Avresti dovuto dirlo nella tua domanda :-)
Sean,

Lo ammetto, +1 per la tua risposta e anche per il commento. (Non posso dare di più)
Anwar,

6
./prepend.sh "myString" ./myfile.txt

noto che prependè la mia shell personalizzata :

#!/bin/sh
#add Line at the top of File
# @author Abdennour TOUMI
if [ -e $2 ]; then
    sed -i -e '1i$1\' $2
fi

Usa anche un percorso relativo o un percorso assoluto, dovrebbe funzionare bene:

./prepend.sh "my New Line at Top"  ../Documents/myfile.txt

Aggiornare :

se vuoi uno script permanente per questo, apri nano /etc/bash.bashrcquindi aggiungi questa funzione alla fine del file:

function prepend(){
# @author Abdennour TOUMI
if [ -e $2 ]; then
    sed -i -e '1i$1\' $2
fi

}

Riapri il tuo terminale e goditi:

prepend "another line at top" /path/to/my/file.txt

5

E perché non usare un vero editor di testo per questo? ed è l'editor di testo standard.

ed -s filename <<< $'1i\nFIRST LINE HERE\n.\nwq'

Oppure, se si desidera che i comandi siano più leggibili:

ed -s filename < <(printf '%s\n' 1i "FIRST LINE" . wq)
  • 1: vai in prima linea
  • i: modalità di inserimento
  • le tue cose che vuoi inserire ...
  • .: interrompe l'inserimento, torna alla modalità normale
  • wq: scrivi ed esci, grazie, ciao.

Come usare la sostituzione delle variabili di shell (nel FIRST LINE) con questo?
vp_arth,

1
@vp_arth Se i contenuti sono in variabile first_lineallora: ed -s filename < <(printf '%s\n' 1i "$first_line" . wq). Assicurati che la variabile non si espanda in un singolo punto e non contenga caratteri di nuova riga (quindi disinfettala se proviene dall'input dell'utente).
gniourf_gniourf

3

C'è sempre l' awkopzione. Sostituisci stringvariabile con i tuoi contenuti. Questo non è un cambiamento sul posto però. Personalmente, tendo a non apportare modifiche sul posto. Questa è sicuramente una preferenza personale. Due cose, -vsignifica una variabile in awk e la variabile nviene utilizzata qui per abbinare un numero di riga, in modo efficace NR == 1. Puoi usarlo in molti modi semplicemente cambiando il valore di ne s.

string="My New first line"; awk -v n=1 -v s="$string" 'NR == n {print s} {print}'     file.source > file.target

Esempio:

% cat file.source                                                                                                                                      

First Line
Second Line
Third Line

% string="Updated First Line"; awk -v n=1 -v s="$string" 'NR == n {print s} {print}' file.source > file.target; cat ./file.target                      !698

Updated First Line
First Line
Second Line
Third Line

2

Puoi usare Vim in modalità Ex:

ex -sc '1i|hello world' -cx sources.list
  1. 1 seleziona 1a riga

  2. i inserisci una nuova riga di testo

  3. x salva e chiudi


Molto più semplice rispetto ad altre soluzioni fornite finora. Grazie.
Pothi Kalimuthu,
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.