Ciao, voglio anteporre il testo a un file. Ad esempio, voglio aggiungere attività all'inizio di un file todo.txt. Sono a conoscenza, echo 'task goes here' >> todo.txt
ma ciò aggiunge la riga alla fine del file (non quello che voglio).
Ciao, voglio anteporre il testo a un file. Ad esempio, voglio aggiungere attività all'inizio di un file todo.txt. Sono a conoscenza, echo 'task goes here' >> todo.txt
ma ciò aggiunge la riga alla fine del file (non quello che voglio).
Risposte:
echo 'task goes here' | cat - todo.txt > temp && mv temp todo.txt
o
sed -i '1s/^/task goes here\n/' todo.txt
o
sed -i '1itask goes here' todo.txt
|
) il messaggio ( echo '...'
) a cat
cui utilizza -
(input standard) come primo file e todo.txt
come secondo. cat
CONCATENA più file. Invia l'output ( >
) a un file denominato temp
. Se non ci sono errori ( &&
) da cat
allora rinomina ( mv
) il temp
file torna al file originale ( todo.txt
).
cat
riceve una barra rovesciata letterale n, non lo convertirà in una nuova riga. Qualcos'altro deve averlo fatto. Invece di cat
, prova a hexdump -C
eseguire il piping in per vedere se stai effettivamente inviando backslash e n o se si tratta di una nuova riga. Puoi anche provare cat -e
a mostrare le terminazioni di riga.
1
mezzi eseguono il comando successivo solo sulla riga uno del file e il i
comando è insert. Cerca nella pagina man sotto la sezione "Indirizzi" e nella sezione "Comandi a indirizzo zero o uno".
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> todo.txt
Mentre le altre risposte funzionano bene, lo trovo molto più facile da ricordare perché uso ogni giorno echo e cat.
EDIT: Questa soluzione è una pessima idea se ci sono delle barre rovesciate todo.txt
, perché grazie -e
all'eco della bandiera le interpreterà. Un altro modo molto più semplice per inserire nuove righe nella stringa della prefazione è ...
echo "task goes here
$(cat todo.txt)" > todo.txt
... semplicemente per usare le nuove linee. Certo, non è più un one-liner, ma realisticamente non era nemmeno un one-liner prima. Se lo stai facendo all'interno di uno script e sei preoccupato per il rientro (ad es. Lo stai eseguendo all'interno di una funzione), ci sono alcune soluzioni alternative per adattarlo perfettamente, incluso ma non limitato a:
(echo 'task goes here' && cat todo.txt) > todo.txt
echo 'task goes here'$'\n'"$(cat todo.txt)" > todo.txt
Inoltre, se ti interessa se una nuova riga viene aggiunta alla fine di todo.txt
, non usarle. Bene, tranne il penultimo. Questo non scherza con la fine.
-e
sequenze di escape convertite anche all'interno di todo.txt non saranno convertite?
L' moreutils
avere un bel strumento chiamato sponge
:
echo "task goes here" | cat - todo.txt | sponge todo.txt
"Assorbirà" STDIN e quindi scriverà nel file, il che significa che non devi preoccuparti dei file temporanei e spostarli.
Puoi ottenere moreutils
con molte distro Linux, attraverso apt-get install moreutils
o su OS X usando Homebrew , con brew install moreutils
.
(echo 'ble'; cat todo.txt)
:-)
Puoi usare Vim in modalità Ex:
ex -s -c '1i|task goes here' -c x todo.txt
1
seleziona la prima riga
i
inserire
x
salva e chiudi
È 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
Puoi anche usare sed
o awk
. Ma sostanzialmente succede la stessa cosa.
new_todo.txt
venga scritto solo parzialmente. La soluzione sembra perdere il file originale.
rm
file originale.
Se il file di testo è abbastanza piccolo da adattarsi alla memoria, non è necessario creare un file temporaneo per sostituirlo. Puoi 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.
Non è possibile inserire contenuto all'inizio di un file. L'unica cosa che puoi fare è sostituire il contenuto esistente o aggiungere byte dopo l'attuale fine del file.
Qualsiasi soluzione alla tua domanda richiede quindi la creazione di un file temporaneo (o buffer) (in memoria o su disco) che alla fine sovrascriverà il file originale.
Fai attenzione a non perdere i dati preservando il file originale durante la creazione di quello nuovo, nel caso in cui il file system sia pieno durante il processo. per esempio:
cat <(echo task go there) todo.txt > todo.txt.new && mv todo.txt.new todo.txt
echo HOME=\"/g/Users/timregan/\" | cat - 'F:\Program Files\Git\etc\profile'
funziona ma cat <echo HOME=\"/g/Users/timregan/\" 'F:\Program Files\Git\etc\profile'
dà l'errore "echo: nessun file o directory"
<
e il (
spezzerebbe la sintassi. Provacat <(echo HOME=\"/g/Users/timregan/\") 'F:\Program Files\Git\etc\profile'
Puoi usare tee
:
echo 'task goes here' | cat - todo.txt | tee todo.txt
GitBash + Windows10 + Multline :
Ecco una versione che ti consente di utilizzare 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]