2011-02-17 03:21:12 +0000 2011-02-17 03:21:12 +0000
306
306

Come posso aggiungere del testo all'inizio di un file in Bash?

Ciao Voglio preporre del testo ad un file. Per esempio, voglio aggiungere dei compiti all'inizio di un file todo.txt. Sono consapevole di echo 'task goes here' >> todo.txt ma questo aggiunge la riga alla fine del file (non quello che voglio).

Risposte (9)

396
396
396
2011-02-17 03:34:10 +0000
echo 'task goes here' | cat - todo.txt > temp && mv temp todo.txt

o

sed -i '1s/^/task goes here\n/' todo.txt
``` ```
sed -i '1itask goes here' todo.txt

o

&001

81
81
81
2012-12-19 18:57:40 +0000

Un'opzione più semplice secondo me è :

echo -e "task goes here\n$(cat todo.txt)" > todo.txt

Questo funziona perché il comando all'interno di $(...) viene eseguito prima che todo.txt venga sovrascritto con > todo.txt

Mentre le altre risposte funzionano bene, trovo questo molto più facile da ricordare perché uso echo e cat tutti i giorni.

EDIT: Questa soluzione è una pessima idea se ci sono dei backshlash in todo.txt, perché grazie alla bandiera -e echo li interpreterà. Un altro modo molto più semplice per inserire le nuove linee nella stringa di prefazione è…

echo "task goes here
$(cat todo.txt)" > todo.txt
``` ```
(echo 'task goes here' && cat todo.txt) > todo.txt
echo 'task goes here'$'\n'"$(cat todo.txt)" > todo.txt

…semplicemente per usare le nuove linee. Certo, non è più una sola riga, ma realisticamente non lo era neanche prima. Se state facendo questo all'interno di uno script, e siete preoccupati di rientrare (ad esempio, lo state eseguendo all'interno di una funzione) ci sono alcune soluzioni per far sì che questo si adatti ancora bene, tra cui, ma non solo:

&001

Inoltre, se vi interessa se una nuova linea viene aggiunta alla fine di todo.txt, non usate queste. Beh, tranne la penultima. Questo non incasina la fine.

28
28
28
2013-04-22 12:47:19 +0000

I moreutils hanno un simpatico strumento chiamato sponge:

echo "task goes here" | cat - todo.txt | sponge todo.txt

Esso “assorbe” STDIN e poi scrive sul file, il che significa che non devi preoccuparti dei file temporanei e spostarli.

Puoi ottenere moreutils con molte distribuzioni Linux, attraverso apt-get install moreutils, o su OS X usando Homebrew , con brew install moreutils.

12
12
12
2016-04-11 00:23:56 +0000

È possibile utilizzare Vim in modalità Ex:

ex -s -c '1i|task goes here' -c x todo.txt
  1. 1 selezionare la prima riga

  2. i inserire

  3. x salvare e chiudere

5
5
5
2011-02-17 03:26:24 +0000

È possibile creare un nuovo file temporaneo.

echo "new task" > new_todo.txt
cat todo.txt >> new_todo.txt
rm todo.txt
mv new_todo.txt todo.txt
``` &001 


Si può anche utilizzare `sed` o `awk`. Ma fondamentalmente succede la stessa cosa.
3
3
3
2011-02-17 06:25:01 +0000

Non è possibile inserire il contenuto all'inizio di un file. L'unica cosa che si può fare è sostituire il contenuto esistente o aggiungere byte dopo l'attuale fine del file.

Qualsiasi soluzione alla vostra domanda richiede la creazione di un file temporaneo (o buffer) (in memoria o su disco) che alla fine sovrascriverà il file originale.

Attenzione a non perdere dati conservando il file originale mentre si crea il nuovo, se il file system dovesse essere pieno durante il processo. ad esempio:

cat <(echo task go there) todo.txt > todo.txt.new && mv todo.txt.new todo.txt
3
3
3
2013-01-09 22:49:33 +0000

Se il file di testo è abbastanza piccolo da entrare in memoria, non è necessario creare un file temporaneo con cui sostituirlo. È possibile caricare tutto in memoria e riscriverlo nel file.

echo "$(echo 'task goes here' | cat - todo.txt)" > todo.txt

È impossibile aggiungere righe all'inizio del file senza sovrascrivere l'intero file.

1
1
1
2014-07-08 14:16:36 +0000

È possibile utilizzare tee:

echo 'task goes here' | cat - todo.txt | tee todo.txt
0
0
0
2018-08-04 07:04:48 +0000

GitBash + Windows10 + Multline :

Ecco una versione che consente di utilizzare le stringhe multilinea.

##############################################
## This section for demo purpose only, ##
## So you can save entire file as ##
## whatever.sh and run it. ##
## ##
##############################################
> MY_TARGET_FILE.txt ##Make Or Clear File
echo "[STARTER_CONTENT]" >> MY_TARGET_FILE.txt
##############################################

## Below is main code:

##################################################
TARGET_FILE_VARIABLE="MY_TARGET_FILE.txt"
ADD_TO_HEAD_VARIABLE=$(cat << "HEREDOC_HEAD_TEXT"
//| +-------------------------------------+ |//
//| | | |//
//| | MESSAGE_FOR_HEAD_OF_FILE | |//
//| | | |//
//| +-------------------------------------+ |//
HEREDOC_HEAD_TEXT
)
##################################################
TAR=$TARGET_FILE_VARIABLE ##
TEX=$ADD_TO_HEAD_VARIABLE ##
echo "$TEX" | cat - $TAR > TEMP && mv TEMP $TAR ##
##################################################

## Expected contents of MY_TARGET_FILE.txt :
## //| +-------------------------------------+ |//
## //| | | |//
## //| | MESSAGE_FOR_HEAD_OF_FILE | |//
## //| | | |//
## //| +-------------------------------------+ |//
## [STARTER_CONTENT]