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

时间:2012-09-21 04:34:38

标签: bash newline line-breaks

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

9 个答案:

答案 0 :(得分:186)

如果您的预期输出是单行,则只需从输出中删除所有换行符即可。管道到'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)"

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


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

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

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

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

perl -pe 'chomp if eof' log.txt


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

head -c -1 log.txt

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

cat -A log.txt

答案 1 :(得分:87)

一种方式:

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

答案 2 :(得分:10)

Bash variable substitution中还可以直接支持删除空格:

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

答案 3 :(得分:8)

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

linecount=`wc -l < log.txt`

答案 4 :(得分:8)

printf已经为你裁掉了追踪换行符:

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

详情:

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

答案 5 :(得分:5)

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

如果你已经在一个变量中有它,那么用trailing newline裁剪:

来回显它
    $ testvar=$(wc -l < log.txt)
    $ echo -n $testvar

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

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

答案 6 :(得分:3)

如果您只想删除最后一个换行符,请通过以下方式进行操作:

sed -z '$ s/\n$//'
如果通过sed将定界符设置为\0,则

NUL不会在流的末尾添加-z,而创建POSIX文本文件(定义为以\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+$//'

答案 7 :(得分:0)

使用 awk:

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

说明:

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

答案 8 :(得分:0)

最重要的是添加这个供我参考^_^

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

VAR=$'helloworld\n'

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

echo "${CLEANED}"