Jak dołączyć tekst do pliku?

109

Jaki jest najłatwiejszy sposób dołączania tekstu do pliku w systemie Linux?

Rzuciłem okiem na to pytanie , ale zaakceptowana odpowiedź wykorzystuje dodatkowy program ( sed) Jestem pewien, że powinien być łatwiejszy sposób z echolub podobnym.

Dchris
źródło

Odpowiedzi:

125
cat >> filename
This is text, perhaps pasted in from some other source.
Or else entered at the keyboard, doesn't matter. 
^D

Zasadniczo możesz zrzucić dowolny tekst do pliku. CTRL-D wysyła sygnał końca pliku, który kończy wejście i wraca do powłoki.

Jon Kiparsky
źródło
2
Jak mogę to zrobić, gdy plik wymaga uprawnień administratora?
UselesssCat
2
@UselesssCat gdy coś przechodzi w stan „odmowa uprawnień”, ponownie sprawdzam dowolne polecenie, które uruchamiam, a następnie używam sudo !!- co powoduje wykonanie ostatniego polecenia z sudoprzedrostkiem. Niedawno dowiedziałem się, że działa to również z nanoitp. (Przez przypadkową próbę nano nano auth...)
Sandra
jeśli chcesz użyć sudo lub użyć tego w skrypcie, zapoznaj się z moimi następstwami tej zaakceptowanej odpowiedzi poniżej.
user12345
4
Nie wiedziałem, że kota można tak wykorzystać! Jak pisanie wpisu do dziennika. Nie wiedziałem też, co robi ctrl-d. Dziękuję Ci!
houallet
1
@Sandra - Nie używałem !!wcześniej, super. Tak często robię takie rzeczy cat /var/log/apache/error.logi nie otrzymuję pozwolenia. Można to również zrobić za pomocą identyfikatora z historii, np. sudo !1419Spowoduje to wykonanie polecenia w wierszu 1419historii jako sudo.
Cyclonecode
172

Co powiesz na:

echo "hello" >> <filename>

Użycie >>operatora dopisze dane na końcu pliku, natomiast użycie >spowoduje nadpisanie zawartości pliku, jeśli już istnieje.

Możesz też użyć printfw ten sam sposób:

printf "hello" >> <filename>

Pamiętaj, że używanie powyższych może być niebezpieczne. Na przykład, jeśli masz już plik i musisz dołączyć dane na końcu pliku i zapomnisz dodać ostatni, >wszystkie dane w pliku zostaną zniszczone. Możesz zmienić to zachowanie, ustawiając noclobberzmienną w .bashrc:

set -o noclobber

Teraz, kiedy spróbujesz to zrobić echo "hello" > file.txt, otrzymasz ostrzeżenie cannot overwrite existing file.

Aby wymusić zapis do pliku, musisz teraz użyć specjalnej składni:

echo "hello" >| <filename>

Powinieneś również wiedzieć, że domyślnie echododaje końcowy znak nowej linii, który można pominąć za pomocą -nflagi:

echo -n "hello" >> <filename>

Bibliografia

Cyclonecode
źródło
4
Ogólnie rzecz biorąc, podoba mi się to bardziej niż akceptowana odpowiedź, która używa cat, ale lepiej bądź ostrożny, upewniając się, że używasz >>zamiast >!
sixty4bit
@ sixty4bit - Całkowicie się zgadzam, ale myślę, że zawsze musisz wiedzieć, co robisz podczas pracy z powłoką, albo możesz zrobić coś takiego jak sudo rm -r /=)
Cyclonecode
1
lepiej sudo rm -r /niż sudo rm -rf /! ^ _ ^ Czy jest flaga, która prosiłaby o potwierdzenie przed nadpisaniem zawartości istniejącego pliku >? Aliasowanie tego, aby zawsze używać takiej flagi, wydaje się być dobrym pomysłem.
sixty4bit
2
@ sixty4bit - Możesz dodać set -o noclobberswój .bashrc, ale nie możesz nadpisać istniejącego pliku bez użycia specjalnej składniecho "hello" >| <filename>
Cyclonecode
czy możesz podać przykład wywołania pliku, powiedz „mojPlik.txt” czy coś takiego? Nie jestem pewien, czy w twoim przykładzie jest to <nazwa pliku> czy nazwa pliku
bharal
24

Innym możliwym sposobem jest:

echo "text" | tee -a filename >/dev/null

-aDołączy na końcu pliku.

W razie potrzeby sudoużyj:

echo "text" | sudo tee -a filename >/dev/null
user9869932
źródło
Dlaczego na końcu> / dev / null?
Quadrivium
1
Na >/dev/nullkońcu zapobiega wyświetlaniu "tekstu" w konsoli.
user9869932
13

Kontynuuj, aby zaakceptować odpowiedź.

Jeśli używasz tego w skrypcie, potrzebujesz czegoś innego niż CTRL-D do wyznaczenia końca . Spróbuj tego zamiast tego:

cat << EOF >> filename
This is text entered via the keyboard or via a script.
EOF

Spowoduje to dołączenie tekstu do podanego pliku (z wyłączeniem „EOF”).

Wykorzystuje tutaj dokument (lub heredoc) .

Jeśli jednak potrzebujesz sudo do dołączenia do podanego pliku, napotkasz problemy z używaniem heredoc z powodu przekierowania I / O, jeśli piszesz bezpośrednio w wierszu poleceń.

Ta odmiana zadziała, gdy będziesz pisać bezpośrednio w wierszu poleceń:

sudo sh -c 'cat << EOF >> filename
This is text entered via the keyboard.
EOF'

Lub możesz użyć teezamiast tego, aby uniknąć problemu z wierszem poleceń sudo, który pojawia się podczas używania heredoc z cat:

tee -a filename << EOF
This is text entered via the keyboard or via a script.
EOF
user12345
źródło
Używam cat << 'EOF' >od lat i nie wiedziałem o cat << 'EOF' >>dołączaniu! Dzięki
FreeSoftwareServers