hex*_*ide 163 bash newline line-breaks
当我在Bash中执行命令(或具体地说wc -l < log.txt)时,输出后面包含一个换行符.我怎么摆脱它?
Ste*_*eve 214
如果您的预期输出是单行,则只需从输出中删除所有换行符即可.管道到'tr'实用程序或Perl(如果首选)是不常见的:
wc -l < log.txt | tr -d '\n'
wc -l < log.txt | perl -pe 'chomp'
Run Code Online (Sandbox Code Playgroud)
您还可以使用命令替换来删除尾随换行符:
echo -n "$(wc -l < log.txt)"
printf "%s" "$(wc -l < log.txt)"
Run Code Online (Sandbox Code Playgroud)
请注意,我不同意OP决定选择接受的答案.我相信应尽可能避免使用'xargs'.是的,这是一个很酷的玩具.不,你不需要它.
如果您的预期输出可能包含多行,则您还有另一个决定:
如果要从文件末尾删除MULTIPLE换行符,请再次使用cmd替换:
printf "%s" "$(< log.txt)"
Run Code Online (Sandbox Code Playgroud)
如果要从文件中严格删除最后一行换行符,请使用Perl:
perl -pe 'chomp if eof' log.txt
Run Code Online (Sandbox Code Playgroud)
请注意,如果您确定要删除一个尾随换行符,则可以使用GNU coreutils中的"head"来选择除最后一个字节之外的所有内容.这应该很快:
head -c -1 log.txt
Run Code Online (Sandbox Code Playgroud)
此外,为了完整起见,您可以使用"cat"和"show-all"标志快速检查文件中换行符(或其他特殊字符)的位置.美元符号字符将指示每行的结尾:
cat -A log.txt
Run Code Online (Sandbox Code Playgroud)
Sat*_*tya 87
单程:
wc -l < log.txt | xargs echo -n
Run Code Online (Sandbox Code Playgroud)
Tom*_*ale 19
如果您只想删除最后一个换行符,请通过管道:
sed -z '$ s/\n$//'
Run Code Online (Sandbox Code Playgroud)
sed\0如果分隔符设置为NULvia -z,则不会在流的结尾添加 a ,而要创建 POSIX 文本文件(定义为以 a 结尾\n),它将始终输出最终\n不带-z.
例如:
$ { echo foo; echo bar; } | sed -z '$ s/\n$//'; echo tender
foo
bartender
Run Code Online (Sandbox Code Playgroud)
并证明没有NUL添加:
$ { echo foo; echo bar; } | sed -z '$ s/\n$//' | xxd
00000000: 666f 6f0a 6261 72 foo.bar
Run Code Online (Sandbox Code Playgroud)
要删除多个尾随换行符,请通过管道:
sed -Ez '$ s/\n+$//'
Run Code Online (Sandbox Code Playgroud)
And*_*nov 12
在Bash变量替换中也直接支持空格删除:
testvar=$(wc -l < log.txt)
trailing_space_removed=${testvar%%[[:space:]]}
leading_space_removed=${testvar##[[:space:]]}
Run Code Online (Sandbox Code Playgroud)
如果将其输出分配给变量,bash则会自动删除空格:
linecount=`wc -l < log.txt`
Run Code Online (Sandbox Code Playgroud)
printf已为您裁剪尾随换行符:
$ printf '%s' $(wc -l < log.txt)
Run Code Online (Sandbox Code Playgroud)
详情:
%s字符串占位符. %s\n),它就不会.添加这个供我参考,比其他任何东西都重要^_^
您还可以使用 bash 扩展魔法从输出中删除新行
VAR=$'helloworld\n'
CLEANED="${VAR%$'\n'}"
echo "${CLEANED}"
Run Code Online (Sandbox Code Playgroud)
小智 5
如果要在不带行尾的情况下以Bash打印任何内容的输出,请使用-n开关将其回显。
如果您已经将其包含在变量中,则以裁剪的换行符回显它:
$ testvar=$(wc -l < log.txt)
$ echo -n $testvar
Run Code Online (Sandbox Code Playgroud)
或者,您也可以一行完成,而不是:
$ echo -n $(wc -l < log.txt)
Run Code Online (Sandbox Code Playgroud)