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

Jak dodać tekst do początku pliku w Bash'u?

Cześć Chcę przygotować tekst do pliku. Na przykład chcę dodać zadania na początku pliku todo.txt. Wiem o echo 'task goes here' >> todo.txt, ale to dodaje linię na końcu pliku (nie to co chcę).

Odpowiedzi (9)

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

lub

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

lub

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

Prostszą opcją w mojej opinii jest :

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

To działa, ponieważ komenda wewnątrz $(...) jest wykonywana przed todo.txt jest nadpisywana > todo.txt

Podczas gdy pozostałe odpowiedzi działają dobrze, ja uważam, że jest to o wiele łatwiejsze do zapamiętania, ponieważ codziennie używam echa i kota.

EDIT: To rozwiązanie jest bardzo złym pomysłem, jeśli są jakieś backslashe w todo.txt, ponieważ dzięki fladze -e echo będzie je interpretować. Innym, o wiele łatwiejszym sposobem na wprowadzenie nowych linii do łańcucha wstępnego jest…

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

…po prostu użycie nowych linii. Jasne, nie jest to już jedna linijka, ale realistycznie rzecz biorąc, nie była to też wcześniej jedna linijka. Jeśli robisz to wewnątrz skryptu i martwisz się o wcięcie (np. wykonujesz to wewnątrz funkcji), istnieje kilka obejść, które sprawią, że będzie to nadal dobrze pasować, w tym między innymi:

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

Również, jeśli zależy Ci na tym, czy nowa linia zostanie dodana do końca todo.txt, nie używaj ich. Cóż, z wyjątkiem tej drugiej do końca. To nie zadziera z końcem.

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

moreutils ](http://joeyh.name/code/moreutils/) mają ładne narzędzie o nazwie sponge:

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

“wsiąknie” STDIN, a następnie napisze do pliku, co oznacza, że nie musisz się martwić o pliki tymczasowe i ich przenoszenie.

Możesz dostać moreutils z wieloma dystrybutorami Linuksa, przez apt-get install moreutils, lub na OS X używając Homebrew , z brew install moreutils.

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

Możesz używać Vima w trybie Ex:

ex -s -c '1i|task goes here' -c x todo.txt
  1. 1 wybierz pierwszą linię

  2. i wstaw

  3. x zapisz i zamknij

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

Możesz utworzyć nowy, tymczasowy plik.

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

Możesz również użyć sed lub awk. Ale w zasadzie to samo dzieje się z plikiem tymczasowym.

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

Nie można wstawić zawartości na początku pliku. Jedyne, co możesz zrobić, to albo zastąpić istniejącą zawartość, albo dodać bajty po aktualnym końcu pliku.

Każde rozwiązanie problemu wymaga utworzenia pliku tymczasowego (lub bufora) (w pamięci lub na dysku), który ostatecznie nadpisze oryginalny plik.

Strzeż się, aby nie utracić danych poprzez zachowanie oryginalnego pliku podczas tworzenia nowego, jeśli podczas procesu system plików będzie pełny, np.

3
3
3
2013-01-09 22:49:33 +0000

Jeśli plik tekstowy jest wystarczająco mały, aby zmieścić się w pamięci, nie trzeba tworzyć pliku tymczasowego, aby go zastąpić. Można go wczytać do pamięci i zapisać z powrotem do pliku.

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

Nie można dodać linii do początku pliku bez nadmiernego zapisu całego pliku.

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

Możesz użyć tee:

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

GitBash + Okna10 + Multline :

Oto wersja, która pozwala używać wieloliniowych łańcuchów.

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