Bash: разделительная строка с выводом строки

Когда я выполняю команды в Bash (или, если быть конкретным, wc -l < log.txt), вывод содержит строку после него. Как я могу избавиться от него?

Ответ 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+$//'