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

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

单程:

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

如果您的预期输出是单行 ,则可以简单地从输出中删除所有换行符。 将“tr”实用程序连接到Perl,如果是首选,则连接到Perl也不常见:

 wc -l < log.txt | tr -d '\n' wc -l < log.txt | perl -pe 'chomp' 

您也可以使用命令replace来删除尾随的换行符:

 echo -n "$(wc -l < log.txt)" printf "%s" "$(wc -l < log.txt)" 

请注意,我不同意OPselect接受答案的决定。 我相信应尽可能避免使用“xargs”。 是的,这是一个很酷的玩具。 不,你不需要这里


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

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

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

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

 perl -pe 'chomp if eof' log.txt 


请注意,如果您确定要删除末尾的换行符,则可以使用GNU coreutils中的“head”来select除最后一个字节之外的所有内容。 这应该是相当快的:

 head -c -1 log.txt 

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

 cat -A log.txt 

如果将其输出分配给一个variables, bash自动删除空格:

 linecount=`wc -l < log.txt` 

在Bashvariablesreplace中,也直接支持空白去除:

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

printf已经为你编制了最后的换行符:

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

详情:

  • printf将打印您的内容来代替%sstring占位符。
  • 如果你不告诉它打印一个换行符( %s\n ),它不会。

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

如果你已经在一个variables中,然后回车与裁剪后的换行符 :

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

或者你可以在一行中做,而不是:

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