Chcę przypisać wynik grep do zmiennej do dalszego wykorzystania:
lines=`cat abc.txt | grep "hello"`
ale to co znalazłem to $ lines nie zawiera już znaku nowej linii. Więc kiedy to robię
echo $lines
drukowana jest tylko jedna linia. Jak mogę zachować znak nowej linii, więc gdy i echo $ wierszy, to jest tak samo jak cat abc.txt | grep "hello".
Odpowiedzi:
36 dla odpowiedzi nr 1Chcesz powiedzieć
echo "$lines"
zamiast
echo $lines
Opracować:
echo $lines
oznacza „Utwórz nowe polecenie, zastępując je $lines
z zawartością zmiennej o nazwie lines
, dzieląc go na spacje, aby utworzyć zero lub więcej nowych argumentów echo
dowództwo. Na przykład:
lines="1 2 3"
echo $lines # equivalent to "echo 1 2 3"
lines="1 2 3"
echo $lines # also equivalent to "echo 1 2 3"
lines="1
2
3"
echo $lines # also equivalent to "echo 1 2 3"
Wszystkie te przykłady są równoważne, ponieważ powłoka ignoruje określony rodzaj białych znaków między poszczególnymi słowami przechowywanymi w zmiennej lines
. Dokładniej mówiąc, powłoka dzieli zawartość zmiennej na znaki specjalnej IFS
(Internal Field Separator) zmienna, która domyślnie (przynajmniej w mojej wersji basha) odpowiada trzem znakom spacji, tabulacji i nowej linii.
echo "$lines"
z drugiej strony oznacza utworzenie pojedynczego nowego argumentu z dokładnej wartości zmiennej lines
.
Więcej informacji można znaleźć w sekcjach „Ekspansja” i „Dzielenie słów” na stronie podręcznika bash.
0 dla odpowiedzi nr 2
Używanie portu Windows dla grep (nie oryginalne pytanie, nie i nie dotyczy * nix). znalazłem to -U
rozwiązał problem ładnie.
Od --help
:
-U, --binary nie usuwa znaków CR w EOL (MSDOS)