Pytanie OP miało zbyt wiele możliwych odpowiedzi, aby mogło być interesujące. Zacznij od echo -e $(cat test.txt).
Thomas Dickey,
Odpowiedzi:
10
Szukałem rozwiązania dokładnie tego pytania o bash. Prawie nie zauważyłem komentarza @Thomas Dickey, który dostarczył mi najbardziej eleganckiego rozwiązania.
echo -e $(cat test.txt)
Niektóre rzeczy, które nie zadziałały dla mnie to (najwyraźniej nie można potokować rzeczy do echa)
cat test.txt | echo -e
lub
less -R test.txt
Innym problemem, jaki miałem, było to, że echo -e nie drukowało ładnie nowych linii i sąsiadujących białych znaków w pliku. Aby je wydrukować, użyłem następujących.
echo -ne $(cat test.txt | sed 's/$/\\n/'| sed 's/ /\\a /g')
Dobra odpowiedź, ale \adzwoni do mnie. Zmieniłem twoje drugie polecenie sed, na sed 's/ /\\033\\a /g'które nie dzwoni dzwonek.
jastrząb
1
Po dalszych testach i znalezieniu większej niespójności w różnych programach terminalowych (iTerm, Atom / nuclide), znalazłem, że najlepiej jest zawijać $(cat file.txt)podwójne cudzysłowy i dodawać nowy wiersz na końcu - bez potrzeby sed - tak: echo -ne "$(<file.txt)" \\nlub echo -ne "$(cat <<"EOF" . . . EOF)" \\n. Zapobiega to również wykonywaniu przez bash ekspansji globalnej w tekście.
jastrząb
1
Jeśli nie widzisz kolorów z catkontrolnych znaków, prawdopodobnie nie są one nienaruszone.
Niektóre narzędzia usuwają znaki kontrolne, ale pozostawiają na końcu.
Porównać:
echo -e "\e[0;31mExample\e[0m foo"
do
echo -e "[0;31mExample[0m foo"
Być może będziesz w stanie odbudować sekwencję kontrolną z tego, co zostało, ale nie jest to głupi dowód, ponieważ regex, którego używasz, może przypadkowo przyciągnąć niezamierzone sekwencje znaków itp. Ale na przykład:
echo -e "[0;31mExample[0m foo"| sed "s:\[\([0-9]*[;m]\):^[[\1:g"
Powinno działać domyślnie. Np jeśli robię ls --color=always > /tmp/ai nie cat /tmp/awidzę kolory. Sprawdzanie za pomocą odpotwierdza, że plik używa kolorów ANSI.
Myślę więc, że powinieneś sprawdzić, czy twój terminal obsługuje kolory ANSI (i są one włączone).
less -R
, na przykład.cat
druk?echo -e $(cat test.txt)
.Odpowiedzi:
Szukałem rozwiązania dokładnie tego pytania o bash. Prawie nie zauważyłem komentarza @Thomas Dickey, który dostarczył mi najbardziej eleganckiego rozwiązania.
Niektóre rzeczy, które nie zadziałały dla mnie to (najwyraźniej nie można potokować rzeczy do echa)
lub
Innym problemem, jaki miałem, było to, że echo -e nie drukowało ładnie nowych linii i sąsiadujących białych znaków w pliku. Aby je wydrukować, użyłem następujących.
Działa to dla pliku test.txt zawierającego
źródło
\a
dzwoni do mnie. Zmieniłem twoje drugie polecenie sed, nased 's/ /\\033\\a /g'
które nie dzwoni dzwonek.$(cat file.txt)
podwójne cudzysłowy i dodawać nowy wiersz na końcu - bez potrzeby sed - tak:echo -ne "$(<file.txt)" \\n
lubecho -ne "$(cat <<"EOF" . . . EOF)" \\n
. Zapobiega to również wykonywaniu przez bash ekspansji globalnej w tekście.Jeśli nie widzisz kolorów z
cat
kontrolnych znaków, prawdopodobnie nie są one nienaruszone.Niektóre narzędzia usuwają znaki kontrolne, ale pozostawiają na końcu.
Porównać:
do
Być może będziesz w stanie odbudować sekwencję kontrolną z tego, co zostało, ale nie jest to głupi dowód, ponieważ regex, którego używasz, może przypadkowo przyciągnąć niezamierzone sekwencje znaków itp. Ale na przykład:
przywróci kolor do przykładowego ciągu.
źródło
Powinno działać domyślnie. Np jeśli robię
ls --color=always > /tmp/a
i niecat /tmp/a
widzę kolory. Sprawdzanie za pomocąod
potwierdza, że plik używa kolorów ANSI.Myślę więc, że powinieneś sprawdzić, czy twój terminal obsługuje kolory ANSI (i są one włączone).
źródło