Баш: прокладка продольного переноса с выхода


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

6 105

6 ответов:

если ожидаемый результат-одна строка, вы можете просто удалить все символы новой строки с выхода. Это не было бы необычно для трубы к утилите' 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)"

обратите внимание, что я не согласен с решением ОП выбрать принятый ответ. Я считаю, что следует избегать использования "xargs", где это возможно. Да, это классная игрушка. Нет, вам это здесь не нужно.


если ваш ожидаемый результат может содержать несколько строк, вы должны принять другое решение:

если вы хотите удалить несколько символов новой строки из конца файла, снова используйте подстановку cmd:

printf "%s" "$(< log.txt)"

если вы хотите строго удалить последний символ новой строки из файла, используйте Perl:

perl -pe 'chomp if eof' log.txt


обратите внимание, что если вы уверены, что у вас есть завершающий символ новой строки вы хотите удалить, вы можете использовать 'head' из GNU coreutils, чтобы выбрать все, кроме последнего байта. Это должно быть довольно быстро:

head -c -1 log.txt

кроме того, для полноты вы можете быстро проверить, где находятся ваши символы новой строки (или другие специальные) в вашем файле, используя флаг " cat " и "show-all". Символ знака доллара будет указывать на конец каждой строки:

cat -A log.txt

в одну сторону:

wc -l < log.txt | xargs echo -n

существует также прямая поддержка удаления пробелов в замена переменной Bash:

testvar=$(wc -l < log.txt)
trailing_space_removed=${testvar%%[[:space:]]}
leading_space_removed=${testvar##[[:space:]]}

Если вы назначаете его выход переменной,bash автоматически удаляет пробельные символы:

linecount=`wc -l < log.txt`

printf уже обрезает конечную новую строку для вас:

$ printf '%s' $(wc -l < log.txt)

деталь:

  • функции printf будет выводить свой контент на месте %s строка место держатель.
  • если вы не скажете ему напечатать новую строку (%s\n), он не будет.

Если вы хотите напечатать вывод чего-либо в Bash без конца строки, вы повторяете его с помощью -n переключатель.

Если у вас есть это в переменной уже, то эхо его с trailing newline обрезанные:

    $ testvar=$(wc -l < log.txt)
    $ echo -n $testvar

или вы можете сделать это в одну строку, вместо:

    $ echo -n $(wc -l < log.txt)