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

Hoe voeg ik tekst toe aan het begin van een bestand in Bash?

Hoi ik wil vooraf tekst aan een bestand toevoegen. Ik wil bijvoorbeeld taken toevoegen aan het begin van een todo.txt bestand. Ik ben me bewust van echo 'task goes here' >> todo.txt maar dat voegt de regel toe aan het einde van het bestand (niet wat ik wil).

Antwoorden (9)

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

of

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

of

sed -i '1itask goes here' todo.txt
81
81
81
2012-12-19 18:57:40 +0000

Een eenvoudigere optie is naar mijn mening :

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

Dit werkt omdat het commando binnenin $(...) wordt uitgevoerd voordat todo.txt wordt overschreven met > todo.txt

Terwijl de andere antwoorden prima werken, vind ik dit veel makkelijker te onthouden omdat ik elke dag echo en kat gebruik.

EDIT: Deze oplossing is een heel slecht idee als er backslashes in todo.txt zitten, want dankzij de -e vlagsecho zal deze worden geïnterpreteerd. Een andere, veel eenvoudigere manier om nieuwe lijnen in de voorwoordstring te krijgen is…

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

…gewoonweg om nieuwe lijnen te gebruiken. Zeker, het is geen one-liner meer, maar realistisch gezien was het ook geen one-liner voordien. Als je dit in een script doet, en je maakt je zorgen over het inspringen (bv. je voert dit uit in een functie) zijn er een paar workarounds om dit nog steeds goed te laten passen, inclusief maar niet beperkt tot:

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

Ook, als je je zorgen maakt of er een nieuwe regel wordt toegevoegd aan het einde van todo.txt, gebruik deze dan niet. Nou ja, behalve de op één na laatste. Dat is geen probleem voor het einde.

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

De moreutils hebben een mooie tool die sponge heet:

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

Het “slokt” STDIN op en schrijft dan naar het bestand, wat betekent dat je je geen zorgen hoeft te maken over tijdelijke bestanden en het verplaatsen ervan.

Je kunt moreutils krijgen met veel Linux distro’s, via apt-get install moreutils, of op OS X met behulp van Homebrew , met brew install moreutils.

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

U kunt Vim in Ex-modus gebruiken:

ex -s -c '1i|task goes here' -c x todo.txt
  1. 1 selecteer eerste regel

  2. i tussenvoegsel

  3. x opslaan en sluiten

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

U kunt een nieuw, tijdelijk bestand aanmaken.

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

U kunt ook sed of awk gebruiken. Maar in principe gebeurt hetzelfde.

3
3
3
2011-02-17 06:25:01 +0000

U kunt geen inhoud invoegen aan het begin van een bestand. Het enige wat u kunt doen is ofwel de bestaande inhoud vervangen ofwel bytes toevoegen na het huidige einde van het bestand.

Elke oplossing voor uw vraag vereist dan dat er een tijdelijk bestand (of buffer) wordt aangemaakt (op geheugen of op schijf) dat uiteindelijk het originele bestand zal overschrijven.

Pas op voor het niet verliezen van gegevens door het originele bestand te bewaren tijdens het aanmaken van het nieuwe bestand, mocht het bestandssysteem toevallig vol zijn tijdens het proces. b.v.:

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

Als het tekstbestand klein genoeg is om in het geheugen te passen, hoeft u geen tijdelijk bestand aan te maken om het te vervangen. Je kunt het allemaal in het geheugen laden en terug naar het bestand schrijven.

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

Het is onmogelijk om regels aan het begin van het bestand toe te voegen zonder het hele bestand over te schrijven.

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

U kunt tee gebruiken:

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

GitBash + Windows10 + Multline :

Hier is een versie waarmee je multi-line strings kunt gebruiken.

##############################################
## 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]