Bash:从输出中去掉尾随换行符

当我在Bash(或确切地说,wc -l < log.txt)中执行命令时,输出后包含一个换行符。我怎样才能摆脱它呢?

306624 次浏览

一个方法:

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

如果您的期望输出是单行,你可以简单地从输出中删除所有换行符。将管道连接到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)"

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

如果你想从文件末尾删除多个换行符,再次使用cmd替换:

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

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

perl -pe 'chomp if eof' log.txt

注意,如果你确定你有一个末尾换行符想要删除,你可以使用GNU coreutils中的head来选择除最后一个字节以外的所有内容。这应该相当快:

head -c -1 log.txt

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

cat -A log.txt

如果你将它的输出赋值给一个变量,bash会自动去除空白:

linecount=`wc -l < log.txt`

如果你想在Bash中输出任何东西而不带行尾,你可以用-n开关回显它。

如果你已经在变量中有它,那么用拖尾换行符剪裁回显它:

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

或者你可以用一行来代替:

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

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

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

细节:

  • printf将打印您的内容代替%s字符串占位符。
  • 如果你没有告诉它打印换行符(%s\n),它就不会打印。

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

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

如果你想移除只有最后一个换行符,通过:

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

如果通过-z将分隔符设置为NULsed将不会在流的末尾添加\0,而要创建一个POSIX文本文件(定义为以\n结尾),它将始终输出不包含-z的最终\n

例如:

$ { 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+$//'

使用Awk:

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

解释:

  1. ORS的-v赋值
  2. ORS -输出记录分隔符设置为空白。这将用""代替新行(输入记录分隔符);

添加这个是为了我的参考,而不是其他任何东西^_^

还可以使用bash扩展魔术从输出中剥离新行

VAR=$'helloworld\n'


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


echo "${CLEANED}"