Cześć Chcę dodać tekst do pliku. Na przykład chcę dodać zadania na początku pliku todo.txt. Wiem o echo 'task goes here' >> todo.txt
tym, ale to dodaje wiersz na końcu pliku (nie to, czego chcę).
Cześć Chcę dodać tekst do pliku. Na przykład chcę dodać zadania na początku pliku todo.txt. Wiem o echo 'task goes here' >> todo.txt
tym, ale to dodaje wiersz na końcu pliku (nie to, czego chcę).
Odpowiedzi:
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
|
) wiadomość ( echo '...'
), do cat
której używa -
(standardowe wejście) jako pierwszy plik i todo.txt
jako drugi. cat
conCATenates wielu plików. Wyślij wyjście ( >
) do pliku o nazwie temp
. Jeśli nie ma błędów ( &&
) z cat
potem rename ( mv
) z temp
pliku z powrotem do oryginalnego pliku ( todo.txt
).
cat
otrzyma dosłowny ukośnik odwrotny n, nie przekształci go w nowy wiersz. Coś jeszcze musiało to zrobić. Zamiast tego cat
spróbuj potokować, hexdump -C
aby sprawdzić, czy faktycznie wysyłasz odwrotny ukośnik i n, czy jest to nowy wiersz. Możesz także spróbować cat -e
wyświetlić zakończenia linii.
1
Środki wykonują następne polecenie tylko w pierwszej linii pliku, a i
polecenie jest wstawiane. Zajrzyj na stronę manuala w sekcji „Adresy” oraz w sekcji „Polecenia zerowe lub z jednym adresem”.
Moim zdaniem prostszą opcją jest:
echo -e "task goes here\n$(cat todo.txt)" > todo.txt
Działa to, ponieważ polecenie wewnątrz $(...)
jest wykonywane przed todo.txt
nadpisaniem> todo.txt
Podczas gdy inne odpowiedzi działają dobrze, o wiele łatwiej mi to zapamiętać, ponieważ codziennie używam echa i kota.
EDYCJA: To rozwiązanie jest bardzo złym pomysłem, jeśli występują jakieś ukośniki odwrotne todo.txt
, ponieważ dzięki -e
flagom echo je zinterpretuje. Innym, o wiele łatwiejszym sposobem umieszczenia nowego wiersza w ciągu przedmowy jest ...
echo "task goes here
$(cat todo.txt)" > todo.txt
... po prostu używać nowych linii. Jasne, nie jest to już jedna linijka, ale realistycznie też nie była wcześniej liniowa. Jeśli robisz to w skrypcie i martwisz się wcięciem (np. Wykonujesz to wewnątrz funkcji), istnieje kilka sposobów obejścia tego problemu, w tym:
(echo 'task goes here' && cat todo.txt) > todo.txt
echo 'task goes here'$'\n'"$(cat todo.txt)" > todo.txt
Ponadto, jeśli zależy Ci na dodaniu nowej linii na końcu todo.txt
, nie używaj ich. Cóż, z wyjątkiem przedostatniego. To nie zadziera z końcem.
-e
konwertowane sekwencje specjalne również nie będą konwertowane w todo.txt?
moreutils
Mieć ładny narzędzie o nazwie sponge
:
echo "task goes here" | cat - todo.txt | sponge todo.txt
„Absorbuje” STDIN, a następnie zapisuje do pliku, co oznacza, że nie musisz się martwić o pliki tymczasowe i ich przenoszenie.
Możesz uzyskać moreutils
z wieloma dystrybucjami Linuksa, przez apt-get install moreutils
lub w systemie OS X za pomocą Homebrew , z brew install moreutils
.
(echo 'ble'; cat todo.txt)
:-)
Możesz używać Vima w trybie Ex:
ex -s -c '1i|task goes here' -c x todo.txt
1
wybierz pierwszą linię
i
wstawić
x
Zapisz i zamknij
Możesz utworzyć nowy plik tymczasowy.
echo "new task" > new_todo.txt
cat todo.txt >> new_todo.txt
rm todo.txt
mv new_todo.txt todo.txt
Możesz także użyć sed
lub awk
. Ale w zasadzie dzieje się to samo.
new_todo.txt
zapisuje się tylko częściowo. Wygląda na to, że Twoje rozwiązanie traci oryginalny plik.
rm
oryginalny plik.
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żesz załadować to wszystko do pamięci i zapisać z powrotem do pliku.
echo "$(echo 'task goes here' | cat - todo.txt)" > todo.txt
Nie można dodawać wierszy na początku pliku bez zapisywania całego pliku.
text=$(cat file)
. Uważaj jednak, aby używać tylko tekstu, ponieważ zmienne powłoki nie są binarnie czyste mywiki.wooledge.org/BashFAQ/058
Nie można wstawiać treści na początku pliku. Jedyne, co możesz zrobić, to albo zastąpić istniejącą zawartość, albo dołączyć bajty po bieżącym końcu pliku.
Każde rozwiązanie twojego pytania wymaga utworzenia pliku tymczasowego (lub bufora) (w pamięci lub na dysku), który ostatecznie zastąpi oryginalny plik.
Uważaj, aby nie utracić danych, zachowując oryginalny plik podczas tworzenia nowego, jeśli w tym czasie system plików będzie pełny. na przykład:
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'
działa, ale cat <echo HOME=\"/g/Users/timregan/\" 'F:\Program Files\Git\etc\profile'
wyświetla błąd „echo: brak takiego pliku lub katalogu”
<
i (
złamałby składnię. Spróbujcat <(echo HOME=\"/g/Users/timregan/\") 'F:\Program Files\Git\etc\profile'
Możesz użyć tee
:
echo 'task goes here' | cat - todo.txt | tee todo.txt
GitBash + Windows10 + Multline :
Oto wersja, która pozwala używać ciągów wieloliniowych .
##############################################
## 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]