当我在Bash(或确切地说,wc -l < log.txt)中执行命令时,输出后包含一个换行符。我怎样才能摆脱它呢?
wc -l < log.txt
一个方法:
wc -l < log.txt | xargs echo -n
如果您的期望输出是单行,你可以简单地从输出中删除所有换行符。将管道连接到tr实用程序并不罕见,如果喜欢,也可以连接到Perl:
tr
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
head -c -1 log.txt
此外,为了完整起见,您可以使用cat和'show-all'标记-A快速检查换行符(或其他特殊)在文件中的位置。美元符号表示每一行的结尾:
cat
-A
cat -A log.txt
如果你将它的输出赋值给一个变量,bash会自动去除空白:
bash
linecount=`wc -l < log.txt`
如果你想在Bash中输出任何东西而不带行尾,你可以用-n开关回显它。
-n
如果你已经在变量中有它,那么用拖尾换行符剪裁回显它:
$ testvar=$(wc -l < log.txt) $ echo -n $testvar
或者你可以用一行来代替:
$ echo -n $(wc -l < log.txt)
printf已经为你裁剪了尾随换行符:
$ printf '%s' $(wc -l < log.txt)
细节:
%s
%s\n
在Bash变量替换中也直接支持删除空白:
testvar=$(wc -l < log.txt) trailing_space_removed=${testvar%%[[:space:]]} leading_space_removed=${testvar##[[:space:]]}
如果你想移除只有最后一个换行符,通过:
sed -z '$ s/\n$//'
如果通过-z将分隔符设置为NUL, sed将不会在流的末尾添加\0,而要创建一个POSIX文本文件(定义为以\n结尾),它将始终输出不包含-z的最终\n。
-z
NUL
sed
\0
\n
例如:
$ { 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+$//'
使用Awk:
awk -v ORS="" '1' log.txt
解释:
添加这个是为了我的参考,而不是其他任何东西^_^
还可以使用bash扩展魔术从输出中剥离新行
VAR=$'helloworld\n' CLEANED="${VAR%$'\n'}" echo "${CLEANED}"