当我在 Bash 中执行命令时(或者具体来说,wc -l < log.txt
),输出后面包含一个换行符。我该如何摆脱它?
9 回答
如果您的预期输出是单行,您可以简单地从输出中删除所有换行符。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)"
如果您的预期输出可能包含多行,您需要做出另一个决定:
如果要从文件末尾删除 MULTIPLE 换行符,请再次使用 cmd 替换:
printf "%s" "$(< log.txt)"
如果要从文件中严格删除最后一个换行符,请使用 Perl:
perl -pe 'chomp if eof' log.txt
请注意,如果您确定要删除尾随换行符,则可以使用head
GNU coreutils 来选择除最后一个字节之外的所有内容。这应该很快:
head -c -1 log.txt
cat
此外,为了完整起见,您可以使用和 'show-all' 标志快速检查换行符(或其他特殊)字符在文件中的位置-A
。美元符号字符将指示每一行的结尾:
cat -A log.txt
单程:
wc -l < log.txt | xargs echo -n
如果您只想删除最后一个换行符,请通过管道:
sed -z '$ s/\n$//'
sed
\0
如果分隔符设置为NUL
via ,则不会将 a 添加到流的末尾-z
,而要创建 POSIX 文本文件(定义为以 a 结尾\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+$//'
在Bash 变量替换中也直接支持删除空格:
testvar=$(wc -l < log.txt)
trailing_space_removed=${testvar%%[[:space:]]}
leading_space_removed=${testvar##[[:space:]]}
如果将其输出分配给变量,bash
则会自动去除空格:
linecount=`wc -l < log.txt`
如果您想在 Bash 中打印任何内容而没有行尾,请使用-n
开关回显它。
如果您已经将它放在变量中,则使用裁剪的尾随换行符来回显它:
$ testvar=$(wc -l < log.txt)
$ echo -n $testvar
或者您可以在一行中执行此操作,而不是:
$ echo -n $(wc -l < log.txt)
printf已经为您裁剪了尾随换行符:
$ printf '%s' $(wc -l < log.txt)
细节:
- printf 将打印您的内容以代替
%s
字符串占位符。 - 如果您不告诉它打印换行符 (
%s\n
),它不会。
使用 awk:
awk -v ORS="" '1' log.txt
解释:
- -v 为 ORS 赋值
- ORS - 输出记录分隔符设置为空白。这将用“”替换新行(输入记录分隔符)
添加此内容以供我参考 ^_^
您还可以使用 bash 扩展魔法从输出中删除一个新行
VAR=$'helloworld\n'
CLEANED="${VAR%$'\n'}"
echo "${CLEANED}"