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


当前回答

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

如果您期望的输出是一行,您可以简单地从输出中删除所有换行符。将管道连接到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变量替换中也直接支持空格移除:

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

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

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

VAR=$'helloworld\n'

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

echo "${CLEANED}"

一个方法:

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