/ / Jak zachować wynik grep za pomocą nowej linii? - bash

Jak zachować wynik grep za pomocą znaku nowej linii? - bash

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 1

Chcesz 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)