Когда я выполняю команды в Bash (или, если быть конкретным, wc -l < log.txt
), вывод содержит строку после него. Как я могу избавиться от него?
Bash: разделительная строка с выводом строки
Ответ 1
Если ваш ожидаемый результат - это одна строка, вы можете просто удалить все символы новой строки из вывода. Неслучайно было бы подключаться к утилите "tr" или к Perl, если это необходимо:
wc -l < log.txt | tr -d '\n'
wc -l < log.txt | perl -pe 'chomp'
Вы также можете использовать подстановку команд для удаления конечной новой строки:
echo -n "$(wc -l < log.txt)"
printf "%s" "$(wc -l < log.txt)"
Обратите внимание, что я не согласен с решением OP о выборе принятого ответа. Я считаю, что следует избегать использования "харгов", где это возможно. Да, это классная игрушка. Нет, вам здесь это не нужно.
Если ваш ожидаемый вывод может содержать несколько строк, у вас есть другое решение:
Если вы хотите удалить MULTIPLE символы новой строки с конца файла, снова используйте замену cmd:
printf "%s" "$(< log.txt)"
Если вы хотите строго удалить символ LAST новой строки из файла, используйте Perl:
perl -pe 'chomp if eof' log.txt
Обратите внимание: если вы уверены, что у вас есть конечный символ новой строки, который вы хотите удалить, вы можете использовать "head" из GNU coreutils для выбора всего, кроме последнего байта. Это должно быть довольно быстро:
head -c -1 log.txt
Кроме того, для полноты вы можете быстро проверить, где ваши символы новой строки (или другие специальные) находятся в вашем файле, используя "cat" и флаг "show-all". Символ знака доллара укажет конец каждой строки:
cat -A log.txt
Ответ 2
Один из способов:
wc -l < log.txt | xargs echo -n
Ответ 3
Существует также прямая поддержка удаления пробелов в замене переменных Bash:
testvar=$(wc -l < log.txt)
trailing_space_removed=${testvar%%[[:space:]]}
leading_space_removed=${testvar##[[:space:]]}
Ответ 4
Если вы назначаете свой вывод переменной, bash
автоматически разделяет пробелы:
linecount=`wc -l < log.txt`
Ответ 5
printf уже обрезает завершающий символ новой строки для вас:
$ printf '%s' $(wc -l < log.txt)
деталь:
- printf напечатает ваш контент вместо строкового заполнителя
%s
. - Если вы не скажете ему напечатать новую строку (
%s\n
), это не будет.
Ответ 6
Если вы хотите напечатать вывод чего-либо в Bash без конца строки, вы должны отобразить его с помощью переключателя -n
.
Если он уже есть в переменной, отобразите его с помощью завершающего символа новой строки, обрезанного:
$ testvar=$(wc -l < log.txt)
$ echo -n $testvar
Или вы можете сделать это в одной строке:
$ echo -n $(wc -l < log.txt)
Ответ 7
Если вы хотите удалить только последнюю новую строку, проследуйте через:
sed -z '$ s/\n$//'
sed
не добавит \0
к концу потока, если разделитель установлен на NUL
через -z
, тогда как для создания текстового файла POSIX (определенного для окончания в \n
)), он всегда будет выводить окончательный вариант \n
без -z
.
Например:
$ { echo foo; echo bar; } | sed -z '$ s/\n$//'; echo tender
foo
bartender
И доказать, что нет NUL
добавлено:
$ { echo foo; echo bar; } | sed -z '$ s/\n$//' | xxd
00000000: 666f 6f0a 6261 72 foo.bar
Чтобы удалить несколько завершающих символов новой строки, проложите через:
sed -Ez '$ s/\n+$//'