Piszę skrypt bash, aby wyszukać plik, jeśli nie istnieje, utwórz go i dołącz do niego:
Host localhost
ForwardAgent yes
"line then new line 'tab' then text"
Myślę więc , że to delikatny format. Wiem, że możesz to zrobić:
cat temp.txt >> data.txt
Ale wydaje się dziwne, ponieważ ma dwie linie. Czy istnieje sposób na dodanie tego w tym formacie:
echo "hello" >> greetings.txt
shell
text-processing
io-redirection
TheLegend
źródło
źródło
( echo "line 1" ; echo "line 2" ) >>greetings.txt
.{ echo "line 1" ; echo "line 2"; } >>greetings.txt
cat <<EOT
theEOT
jest po prostu losowym ciągiem. Może byćcat <<FOO
też.Lub, jeśli chcesz dosłownie tabulatora (zamiast czterech spacji w pytaniu):
Możesz osiągnąć ten sam efekt za pomocą
echo
, ale dokładnie jak różni się od implementacji do implementacji, podczas gdyprintf
jest stały.źródło
źródło
Innym podejściem jest użycie
tee
Kilka wierszy wyboru ze
tee
strony podręcznika użytkownika:źródło
SED może dołączyć wiersz na końcu pliku w taki sposób:
sed -i '$ a text to be inserted' fileName.file
$
wybiera koniec pliku,a
każe mu dołączyć, a następnie tekst, który ma zostać wstawiony. Potem oczywiście nazwa pliku.Źródło: http://www.yourownlinux.com/2015/04/sed-command-in-linux-append-and-insert-lines-to-file.html
========== EDIT == ==========
Czy to podejście ma jakieś dodatkowe zalety niż inne rozwiązania?
Tak, ta metoda ma tę dodatkową zaletę, że dołącza do plików zwracanych podczas wyszukiwania, takich jak:
find . -name "*.html" -exec sed -i '$ a </html>' {} \;
Użyłem powyższego przykładu, aby wstawić końcowy znacznik html, którego brakowało na każdej stronie HTML w kilku katalogach.
===================================
źródło
sed
. BSDsed
poręczeń z błędem:command a expects \ followed by text
. Więc nie używaj tego do skryptu; może się zepsuć. (Lub zrób to poprawnie, ponieważ wymagana składnia BSD jest zgodna z POSIX i będzie działać również na GNUsed
.find
w następujący sposób:find . -name "*.txt" -exec sh -c 'printf "%s\n\t%s\n" "Host localhost" "ForwardAgent yes" >> "$1"' sh {} ";"
.>
,>>
), a zatem nie ma problemów z uruchomieniemsudo echo 'something' > /file
. Dla mnie to doskonale pozwala dołączyć linię do pliku w pojemniku LXD tak:lxc exec c sed -- '$ a newline' /myfile
.echo "a new line" >> foo.file
Nie stworzy nową linię, gdy plik nie jest koniec nowej linii, alesed -i '$ a a new line' foo.file
zrobi, więcsed
lepiej jest szczególnie ty zawsze chcesz dołączyć nową linię do pliku.Użyłem sed, ponieważ można go używać z sudo. Na przykład:
alternatywa jest bardzo brzydka jak:
a nawet brzydsze, gdy skończysz z ssh.
źródło
sed -i
nie bierzesz rozszerzenia za argument? Twój przykład może mieć niepoprawne parametry.Kolejna wkładka to:
Wolę przemyślaną
-e
opcję, ponieważ daje większą kontrolę:źródło
Można emulować za
cat >> out.txt
pomocą Perla lub Pythona, aby osiągnąć ten sam efekt. Perl:I Python:
Zauważ, że dla Pythona musisz nacisnąć Ctrl+ Ddwa razy. Aby uzyskać więcej informacji, zobacz powiązane pytanie dotyczące przepływu stosu.
źródło
Oto przykład, aby dołączyć wiele wierszy w pliku:
źródło
Oprócz głównej odpowiedzi, jeśli plik wymaga uprawnień superużytkownika, samo dodanie
sudo
przedecho
nie zadziała.Wynika to z faktu, że powłoka łamie polecenia i chociaż
echo
działała jako root, ale>>
działała z normalnymi uprawnieniami.Będzie to działać dla superużytkownika:
sudo su -c "echo 'Line 3' >> greetings.txt"
źródło
su
tutaj (sudo su
nie jest dobrze). Ale masz rację, że potrzebujesz czegoś, aby zarządzać przekierowaniem powłoki; Być możesudo sh -c "echo stuff >> file.txt"
. Brak oszczędności netto, ale lepsza praktyka.