Chcę zapisać do pliku niektóre wstępnie zdefiniowane teksty:
text="this is line one\n
this is line two\n
this is line three"
echo -e $text > filename
Spodziewam się czegoś takiego:
this is line one
this is line two
this is line three
Ale mam to:
this is line one
this is line two
this is line three
Jestem pewien, że po każdym nie ma miejsca \n
, ale jak powstaje dodatkowa przestrzeń?
text="this is line one\nthis is line two\nthis is line three"
ten sam wiersz ..? (bez żadnego wpisu)\n
na każdej linii, już nacisnąłeś nową linię, aby przejść do nowej linii\n
. Więc dlaczego wstawiłeś następny wiersz w nowym wierszu? Po prostutext="this is line one\nthis is line two\nthis is line three"
\n
na końcu każdego wiersza powoduje, że wszystkie dane wyjściowe działają razem w jednym wierszu."$text"
linii echa ma kluczowe znaczenie. Bez nich żadna z nowych linii (zarówno dosłowna, jak i „\ n”) nie działa. Z nimi wszyscy tak robią.Odpowiedzi:
Heredoc wydaje się w tym celu wygodniejszy. Służy do wysyłania wielu poleceń do programu interpretera poleceń, takiego jak ex lub cat
Ciąg po
<<
wskazuje, gdzie się zatrzymać.Aby wysłać te linie do pliku, użyj:
Możesz również zapisać te linie w zmiennej:
To przechowuje linie do zmiennej o nazwie
VAR
.Podczas drukowania pamiętaj cudzysłowy wokół zmiennej, w przeciwnym razie nie zobaczysz znaków nowej linii.
Co więcej, możesz użyć wcięcia, aby wyróżnić się bardziej w kodzie. Tym razem dodaj
-
po,<<
aby zatrzymać wyświetlanie kart.Ale musisz użyć tabulacji, a nie spacji, do wcięcia w kodzie.
źródło
-d
opcji wread -r -d '' VARIABLE <<- EOM
nie działało dla mnie.Jeśli próbujesz przekształcić ciąg w zmienną, innym łatwym sposobem jest coś takiego:
Jeśli wciśniesz swój ciąg za pomocą tabulatorów (tj. „\ T”), wcięcie zostanie usunięte. Jeśli wcinasz spacjami, wcięcie pozostanie w.
UWAGA: Znaczące jest to, że ostatni nawias zamykający znajduje się w innej linii. Sam
END
tekst musi pojawić się w wierszu.źródło
)
tą samą linią. Wydaje mi się, że dzieje się tak dlatego, że to, co jest pomiędzy,$(
i)
będzie działać we własnym wszechświecie, a rzeczywiste polecenie i tak nie zobaczy „)”. Zastanawiam się, czy to działa również na innych.echo
dodaje spacje między przekazanymi mu argumentami.$text
podlega zmiennej interpretacji i dzieleniu słów, więc twojeecho
polecenie jest równoważne z:Możesz zobaczyć, że spacja zostanie dodana przed „tym”. Możesz usunąć znaki nowego wiersza i zacytować,
$text
aby zachować nowe znaki :Lub możesz użyć
printf
, który jest bardziej solidny i przenośny niżecho
:W
bash
, który obsługuje rozwijanie nawiasów, możesz nawet:źródło
w skrypcie bash działają następujące elementy:
alternatywnie:
nazwa pliku kota daje:
źródło
-e
opcjiecho
. Proszę spróbuj ponownie.Znalazłem więcej rozwiązań, ponieważ chciałem, aby każda linia była odpowiednio wcięta:
Możesz użyć
echo
:To nie działa, jeśli umieścisz
"\n"
tuż przed\
końcem linii.Możesz też użyć
printf
dla lepszej przenośności (zdarzyło mi się mieć wiele problemówecho
):Jeszcze innym rozwiązaniem może być:
lub
Inne rozwiązanie osiąga się przez mieszanie
printf
ised
.Refaktoryzacja kodu sformatowanego w ten sposób nie jest łatwa, ponieważ kodujesz poziom wcięcia w kodzie.
Możliwe jest użycie funkcji pomocnika i niektórych sztuczek polegających na zamianie zmiennych:
źródło
Poniżej znajduje się mój preferowany sposób przypisywania ciągu wieloliniowego do zmiennej (myślę, że wygląda ładnie).
Liczba znaków podkreślenia jest taka sama (tutaj 80) w obu przypadkach.
źródło
Wystarczy wspomnieć o prostym łączeniu jednowierszowym, ponieważ może być czasem użyteczne.
Dostaniesz coś takiego
Wszystkie wiodące i kończące się białe spacje zostaną zachowane
źródło
Można to zrobić na wiele sposobów. Dla mnie ładowanie wcięcia sznurka w sed działa dobrze.
Ta odpowiedź była oparta na odpowiedzi Mateusza Piotrowskiego , ale nieco dopracowana.
źródło
zadziała, jeśli umieścisz go jak poniżej:
źródło