266

当我在 Bash 中执行命令时(或者具体来说,wc -l < log.txt),输出后面包含一个换行符。我该如何摆脱它?

4

9 回答 9

357

如果您的预期输出是单行,您可以简单地从输出中删除所有换行符。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)"

如果您的预期输出可能包含多行,您需要做出另一个决定:

如果要从文件末尾删除 MULTIPLE 换行符,请再次使用 cmd 替换:

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

如果要从文件中严格删除最后一个换行符,请使用 Perl:

perl -pe 'chomp if eof' log.txt

请注意,如果您确定要删除尾随换行符,则可以使用headGNU coreutils 来选择除最后一个字节之外的所有内容。这应该很快:

head -c -1 log.txt

cat此外,为了完整起见,您可以使用和 'show-all' 标志快速检查换行符(或其他特殊)字符在文件中的位置-A。美元符号字符将指示每一行的结尾:

cat -A log.txt
于 2012-09-21T04:39:19.990 回答
90

单程:

wc -l < log.txt | xargs echo -n
于 2012-09-21T04:36:51.777 回答
25

如果您只想删除最后一个换行符,请通过管道:

sed -z '$ s/\n$//'

sed\0如果分隔符设置为NULvia ,则不会将 a 添加到流的末尾-z,而要创建 POSIX 文本文件(定义为以 a 结尾\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+$//'
于 2019-09-27T06:45:12.590 回答
18

在Bash 变量替换中也直接支持删除空格:

testvar=$(wc -l < log.txt)
trailing_space_removed=${testvar%%[[:space:]]}
leading_space_removed=${testvar##[[:space:]]}
于 2013-11-08T11:27:21.660 回答
10

如果将其输出分配给变量,bash则会自动去除空格:

linecount=`wc -l < log.txt`
于 2012-09-21T04:40:15.313 回答
10

如果您想在 Bash 中打印任何内容而没有行尾,请使用-n开关回显它。

如果您已经将它放在变量中,则使用裁剪的尾随换行符来回显它:

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

或者您可以在一行中执行此操作,而不是:

$ echo -n $(wc -l < log.txt)
于 2012-09-21T07:25:55.743 回答
9

printf已经为您裁剪了尾随换行符:

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

细节:

  • printf 将打印您的内容以代替%s字符串占位符。
  • 如果您不告诉它打印换行符 ( %s\n),它不会。
于 2012-09-21T22:32:05.770 回答
1

使用 awk:

awk -v ORS="" '1' log.txt 

解释:

  1. -v 为 ORS 赋值
  2. ORS - 输出记录分隔符设置为空白。这将用“”替换新行(输入记录分隔符)
于 2021-05-19T03:25:53.117 回答
1

添加此内容以供我参考 ^_^

您还可以使用 bash 扩展魔法从输出中删除一个新行

VAR=$'helloworld\n'

CLEANED="${VAR%$'\n'}"

echo "${CLEANED}"
于 2021-07-26T08:24:49.710 回答