Kiedy wykonuję polecenia w języku Bash (a ściślej wc -l < log.txt
), dane wyjściowe zawierają po nim łamanie wierszy. Jak się tego pozbyć?
źródło
Kiedy wykonuję polecenia w języku Bash (a ściślej wc -l < log.txt
), dane wyjściowe zawierają po nim łamanie wierszy. Jak się tego pozbyć?
Jeśli oczekiwanym wyjściem jest pojedynczy wiersz , możesz po prostu usunąć wszystkie znaki nowego wiersza z wyniku. Nie jest niczym niezwykłym podłączanie do narzędzia „tr” lub Perla, jeśli jest to preferowane:
wc -l < log.txt | tr -d '\n'
wc -l < log.txt | perl -pe 'chomp'
Możesz także użyć podstawienia polecenia, aby usunąć końcowy znak nowej linii:
echo -n "$(wc -l < log.txt)"
printf "%s" "$(wc -l < log.txt)"
Należy pamiętać, że nie zgadzam się z decyzją PO o wyborze zaakceptowanej odpowiedzi. Uważam, że w miarę możliwości należy unikać używania „xargs”. Tak, to fajna zabawka. Nie, nie potrzebujesz go tutaj.
Jeśli oczekiwane dane wyjściowe mogą zawierać wiele wierszy , musisz podjąć inną decyzję:
Jeśli chcesz usunąć MULTIPLE znaki nowej linii z końca pliku, ponownie użyj podstawienia cmd:
printf "%s" "$(< log.txt)"
Jeśli chcesz ściśle usunąć OSTATNI znak nowej linii z pliku, użyj Perla:
perl -pe 'chomp if eof' log.txt
Zauważ, że jeśli jesteś pewien, że masz końcowy znak nowej linii, który chcesz usunąć, możesz użyć „head” z GNU coreutils, aby wybrać wszystko oprócz ostatniego bajtu. Powinno to być dość szybkie:
head -c -1 log.txt
Ponadto, dla kompletności, możesz szybko sprawdzić, gdzie znajdują się twoje znaki nowej linii (lub inne znaki specjalne) w twoim pliku, używając „cat” i flagi „pokaż wszystko”. Znak dolara wskazuje koniec każdej linii:
cat -A log.txt
tr --delete '\n'
.| tr -d '\r'
Jednokierunkowa:
źródło
echo -n `wc -l log.txt`
IFS
) w jednym miejscu. Przykładecho "a b" | xargs echo -n
:;echo -n $(echo "a b")
. Może to stanowić problem w przypadku użycia.-e
, będą interpretowane jako opcjaecho
. Jest zawsze bezpieczniejszy w użyciuprintf '%s'
.xargs
jest bardzo wolny w moim systemie (i podejrzewam, że dotyczy to również innych systemów), więcprintf '%s' $(wc -l log.txt)
może być szybszy, ponieważprintf
zwykle jest wbudowany (również dlatego, że nie ma przekierowania informacji). Nigdy nie używaj backticków, były one przestarzałe w nowszych wersjach POSIX i mają wiele wad.Istnieje również bezpośrednie wsparcie dla usuwania białych znaków w podstawieniu zmiennych Bash :
źródło
trailing_linebreak_removed=${testvar%?}
Jeśli przypiszesz jego wynik do zmiennej,
bash
automatycznie usuwa białe znaki:źródło
printf już przycina dla ciebie końcowy znak nowej linii:
Szczegół:
%s
zastępczego łańcucha znaków.%s\n
), nie zrobi tego.źródło
"$(command)"
. Wewnętrzne znaki nowej linii zostaną zachowane - i tylko nowa linia końcowa zostanie usunięta. Powłoka wykonuje tutaj całą pracę -printf
jest tylko sposobem na skierowanie wyników podstawiania poleceń z powrotemstdout
.$( )
konstrukcją. Oto dowód:printf "%s" "$(perl -e 'print "\n"')"
$ printf '%s' "$(wc -l < log.txt)"
Jeśli chcesz usunąć tylko ostatnią nową linię , przeciągnij przez:
sed
nie doda\0
końca do tego strumienia, jeśli ogranicznik jest ustawiony naNUL
via-z
, natomiast aby utworzyć plik tekstowy POSIX (zdefiniowany jako koniec a\n
), zawsze będzie wyświetlał końcowy\n
bez-z
.Na przykład:
I aby udowodnić, że nie
NUL
dodano:Aby usunąć wiele końcowych znaków nowej linii , przeciągnij przez:
źródło
sed
nie zapewnia-z
.Jeśli chcesz wydrukować wynik czegokolwiek w Bash bez końca linii, echo to
-n
przełącznikiem.Jeśli masz go już w zmiennej, powtórz echo z przyciętym końcowym znakiem nowej linii :
Lub możesz to zrobić w jednym wierszu, zamiast tego:
źródło
echo -n $(wc -l < log.txt)
ma ten sam efekt.