当我在Bash中执行命令(或具体地,wc -l < log.txt
)时,输出后面包含一个换行符。我该如何摆脱它?
答案 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)
详情:
%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
说明:
答案 8 :(得分:0)
最重要的是添加这个供我参考^_^
您还可以使用 bash 扩展魔法从输出中删除一个新行
VAR=$'helloworld\n'
CLEANED="${VAR%$'\n'}"
echo "${CLEANED}"