Jak dołączyć wiele wierszy do pliku


301

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

Odpowiedzi:


526
# possibility 1:
echo "line 1" >> greetings.txt
echo "line 2" >> greetings.txt

# possibility 2:
echo "line 1
line 2" >> greetings.txt

# possibility 3:
cat <<EOT >> greetings.txt
line 1
line 2
EOT

Jeśli do zapisu do pliku potrzebne jest sudo (inne uprawnienia użytkownika), użyj tego:

# possibility 1:
echo "line 1" | sudo tee -a greetings.txt > /dev/null

# possibility 3:
sudo tee -a greetings.txt > /dev/null <<EOT
line 1
line 2
EOT

2
@TheLegend To się nazywa „tutaj dokument”. Spójrz na ten akapit na stronie podręcznika.
Hauke ​​Laging

1
Jeszcze jedna możliwość ( echo "line 1" ; echo "line 2" ) >>greetings.txt.
ott--

2
@ ott-- Nie potrzebujesz prawdziwej podpowłoki (tzn. możesz zapisać jeden nowy proces), to wystarczy:{ echo "line 1" ; echo "line 2"; } >>greetings.txt
Hauke ​​Laging

2
jaka jest różnica między EOT a EOL?
cikatomo

15
@cikatomo In cat <<EOTthe EOTjest po prostu losowym ciągiem. Może być cat <<FOOteż.
Hauke ​​Laging

60
printf '%s\n    %s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt

Lub, jeśli chcesz dosłownie tabulatora (zamiast czterech spacji w pytaniu):

printf '%s\n\t%s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt

Możesz osiągnąć ten sam efekt za pomocą echo, ale dokładnie jak różni się od implementacji do implementacji, podczas gdy printfjest stały.



16

Innym podejściem jest użycie tee

tee -a ~/.ssh/config << END
Host localhost
  ForwardAgent yes
END

Kilka wierszy wyboru ze teestrony podręcznika użytkownika:

Narzędzie tee kopiuje standardowe dane wejściowe na standardowe dane wyjściowe, tworząc kopię w zerowych lub większej liczbie plików.

-a - Dołącz wyjście do plików zamiast nadpisywać je.


6

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, akaż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.

===================================


1
Jeśli pokażesz składnię dodawania wielu wierszy do pliku, będzie to odpowiedź na pytanie (choć niezbyt przydatne). Wszystkie pozostałe odpowiedzi po prostu napisz nowy tekst. Ta odpowiedź czyta cały plik i przepisuje go wraz z dodanym tekstem. Czy to podejście ma przewagę nad innymi?
G-Man,

Działa to tylko z GNU sed. BSD sedporę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 GNU sed.
Wildcard

Pozostałe odpowiedzi mogą być stosowane findw następujący sposób: find . -name "*.txt" -exec sh -c 'printf "%s\n\t%s\n" "Host localhost" "ForwardAgent yes" >> "$1"' sh {} ";".
G-Man,

1
Jest to bardzo dobre rozwiązanie, ponieważ nie powoduje przekierowania strumienia ( >, >>), a zatem nie ma problemów z uruchomieniem sudo echo 'something' > /file. Dla mnie to doskonale pozwala dołączyć linię do pliku w pojemniku LXD tak: lxc exec c sed -- '$ a newline' /myfile.
Draco Ater,

echo "a new line" >> foo.fileNie stworzy nową linię, gdy plik nie jest koniec nowej linii, ale sed -i '$ a a new line' foo.filezrobi, więc sedlepiej jest szczególnie ty zawsze chcesz dołączyć nową linię do pliku.
zhouji

1

Użyłem sed, ponieważ można go używać z sudo. Na przykład:

sudo sed -i '$ a text to be inserted' fileName.file 

alternatywa jest bardzo brzydka jak:

sudo bash -c "echo a text to be inserted >> fileName.file"  

a nawet brzydsze, gdy skończysz z ssh.


1
Dlaczego ta odpowiedź została odrzucona? To wygląda na rozwiązanie, którego potrzebuję. Czy jest z tym jakiś problem? Jeśli nie, użyję go i głosuję.
MountainX

Czy sed -inie bierzesz rozszerzenia za argument? Twój przykład może mieć niepoprawne parametry.
protometa

1

Kolejna wkładka to:

echo "Greetings 1" >> greetings.txt && echo "Greetings 2" >> greetings.txt

Wolę przemyślaną -eopcję, ponieważ daje większą kontrolę:

echo -e "Greeting 1\nGreetings 2\n" >> greetings.txt

1

Można emulować za cat >> out.txtpomocą Perla lub Pythona, aby osiągnąć ten sam efekt. Perl:

perl -e 'open(fh,">>","./out.txt");while(<>){printf(fh "%s",$_)};close(fh);'

I Python:

python -c 'import sys;f=open(sys.argv[1],"a");l=[i for i in sys.stdin];f.write("".join(l))' out.txt 

Zauważ, że dla Pythona musisz nacisnąć Ctrl+ Ddwa razy. Aby uzyskać więcej informacji, zobacz powiązane pytanie dotyczące przepływu stosu.


1

Oto przykład, aby dołączyć wiele wierszy w pliku:

{
        echo '  directory "/var/cache/bind";'
        echo '  listen-on { 127.0.0.1; };'
        echo '  listen-on-v6 { none; };'
        echo '  version "";'
        echo '  auth-nxdomain no;'
        echo '  forward only;'  
        echo '  forwarders { 8.8.8.8; 8.8.4.4; };'
        echo '  dnssec-enable no;'
        echo '  dnssec-validation no;'
} >> your_file.txt

0

Oprócz głównej odpowiedzi, jeśli plik wymaga uprawnień superużytkownika, samo dodanie sudoprzed echonie zadziała.

Wynika to z faktu, że powłoka łamie polecenia i chociaż echodział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"


Nie potrzebujesz sututaj ( sudo sunie jest dobrze). Ale masz rację, że potrzebujesz czegoś, aby zarządzać przekierowaniem powłoki; Być może sudo sh -c "echo stuff >> file.txt". Brak oszczędności netto, ale lepsza praktyka.
roaima
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.