Answers:
如果您的预期输出是一行,则可以简单地从输出中删除所有换行符。管道传输到'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”。是的,这是一个很酷的玩具。不,您在这里不需要它。
如果您的预期输出可能包含多行,则您还要做出另一个决定:
如果要从文件末尾删除多个换行符,请再次使用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
tr --delete '\n'
。
| tr -d '\r'
单程:
wc -l < log.txt | xargs echo -n
echo -n `wc -l log.txt`
IFS
)都压缩到一个空格中。例如:echo "a b" | xargs echo -n
; echo -n $(echo "a b")
。对于用例而言,这可能是问题,也可能不是问题。
-e
,它将被解释为的选项echo
。使用它总是更安全printf '%s'
。
xargs
在我的系统上非常慢(而且我怀疑在其他系统上也是如此),因此printf '%s' $(wc -l log.txt)
可能会更快,因为printf
通常是内置的(也因为没有信息重定向)。切勿使用反引号,反引号已在较新的POSIX版本中弃用,并具有许多缺点。
Bash变量替换中还直接支持去除空格:
testvar=$(wc -l < log.txt)
trailing_space_removed=${testvar%%[[:space:]]}
leading_space_removed=${testvar##[[:space:]]}
trailing_linebreak_removed=${testvar%?}
如果将其输出分配给变量,bash
则会自动去除空格:
linecount=`wc -l < log.txt`
printf已经为您裁剪了结尾的换行符:
$ printf '%s' $(wc -l < log.txt)
详情:
%s
字符串占位符打印您的内容。 %s\n
),则不会。"$(command)"
中用双引号引起来,则内部的换行符将被保留-仅尾随的换行符将被删除。Shell在这里完成了所有工作- printf
只是将命令替换的结果引导回的一种方法stdout
。
$( )
构造的。这是证据:printf "%s" "$(perl -e 'print "\n"')"
$ printf '%s' "$(wc -l < log.txt)"
如果您只想删除最后一个换行符,请通过以下方式传递管道:
sed -z '$ s/\n$//'
sed
\0
如果定界符设置为NUL
via -z
,则不会在流的末尾添加a ,而要创建POSIX文本文件(定义为以结尾\n
),它将始终输出final \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+$//'
sed
没有提供-z
。
如果要在不带行尾的情况下以Bash打印任何内容的输出,请使用-n
开关将其回显。
如果您已经将其包含在变量中,则以裁剪的换行符回显它:
$ testvar=$(wc -l < log.txt)
$ echo -n $testvar
或者,您可以一行完成,而不是:
$ echo -n $(wc -l < log.txt)
echo -n $(wc -l < log.txt)
具有相同的效果。