在Bash中执行命令(具体来说是wc -l < log.txt
),输出会包含一个换行符。如何去掉它?
在Bash中执行命令(具体来说是wc -l < log.txt
),输出会包含一个换行符。如何去掉它?
如果你期望的输出是单行文本,你可以简单地将所有换行符从输出中移除。通常可以使用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)"
如果你的预期输出可能包含多行,那么你需要做出另一个决定:
如果你想要从文件末尾移除多个换行符,再次使用 cmd 替换:
printf "%s" "$(< log.txt)"
如果你想严格地从文件中删除最后一个换行符,请使用Perl:
perl -pe 'chomp if eof' log.txt
请注意,如果您确定要删除尾随的换行符,请使用GNU核心实用程序中的head
选择除最后一个字节之外的所有内容。这应该非常快:
head -c -1 log.txt
此外,为了完整起见,您可以使用cat
和“show-all”标志-A
快速检查文件中的换行符(或其他特殊字符)的位置。美元符号表示每行的结尾:
cat -A log.txt
tr --delete '\n'
。 - Elijah Lynn| tr -d '\r'
- AlikElzin-kilakahead -c ...
版本的 -- 因为现在我可以将命令输入到剪贴板并保留格式,但不包括最后的 \n
。例如:alias clip="head -c -1 | xclip -selection clipboard"
,效果还不错。现在你可以将 ls -l | clip
命令输出到 X-Server 的 clipboard
中,而不需要终止符 \n
。因此...我可以将其粘贴到我的下一个命令中,并达到完美的效果。非常感谢! - will一种方法:
wc -l < log.txt | xargs echo -n
echo -n \
wc -l log.txt`` - SatyaIFS
定义)压缩为一个空格。例如: echo "a b" | xargs echo -n
; echo -n $(echo "a b")
。这可能对使用情况有影响,也可能没有。 - musiphilprintf '%s' $(wc -l log.txt)
可能会更快,因为printf
通常是内置的(而且没有信息重定向)。永远不要使用反引号,它们已经在新的POSIX版本中被弃用,并且有许多缺点。 - yynysed -z '$ s/\n$//'
sed
使用-z
设置为NUL
作为分隔符时,它不会在流的末尾添加\0
。但是,为了创建一个POSIX文本文件(定义以\n
结尾),它将始终在没有-z
的情况下输出最后一个\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+$//'
sed
不提供-z
选项。 - Spidey$
是干什么用的吗? - what the$
是用于选择最后一行,从而避免在所有行上执行 sed
命令。请参阅 https://www.gnu.org/software/sed/manual/sed.html#Numeric-Addresses。 - dwettstein在Bash变量替换中也有直接支持删除空格的功能:
testvar=$(wc -l < log.txt)
trailing_space_removed=${testvar%%[[:space:]]}
leading_space_removed=${testvar##[[:space:]]}
trailing_linebreak_removed=${testvar%?}
,它可以去除变量末尾的换行符。请注意,此命令将从原始变量中删除最后一个字符并将其存储在新变量 trailing_linebreak_removed
中。 - PurplProto如果你想在Bash中输出任何内容但不带换行符,你可以使用-n
开关进行echo操作。
如果你已经将内容存储在变量中,那么请使用裁剪了尾换行符的echo命令来输出变量内容:
$ testvar=$(wc -l < log.txt)
$ echo -n $testvar
或者你可以在一行中完成它:
$ echo -n $(wc -l < log.txt)
echo -n $(wc -l < log.txt)
可以达到同样的效果。 - chepnerprintf 已经为您裁剪了末尾的换行符:
$ printf '%s' $(wc -l < log.txt)
详情:
%s
字符串占位符的位置上打印您的内容。%s\n
),它就不会打印。"$(command)"
,则内部的换行符将被保留,只有尾部换行符将被删除。在这里,Shell负责所有工作,printf
只是将命令替换的结果输出到标准输出流的一种方式。 - Brent Bradburn$( )
结构将其去除。 这是证明:printf "%s" "$(perl -e 'print "\n"')"
- Flimm$ printf '%s' "$(wc -l < log.txt)"
- Ilias Karim如果你将其输出赋值给一个变量,bash
会自动去除空格:
linecount=`wc -l < log.txt`
这只是为了方便我个人参考而添加的 ^_^
您还可以使用bash扩展魔法从输出中删除换行符
VAR=$'helloworld\n'
CLEANED="${VAR%$'\n'}"
echo "${CLEANED}"
使用 Awk:
awk -v ORS="" '1' log.txt
说明: