【发布时间】:2012-09-13 12:12:59
【问题描述】:
当我在 Bash 中执行命令时(或者更确切地说,wc -l < log.txt),输出后面会包含一个换行符。我该如何摆脱它?
【问题讨论】:
标签: bash newline line-breaks
当我在 Bash 中执行命令时(或者更确切地说,wc -l < log.txt),输出后面会包含一个换行符。我该如何摆脱它?
【问题讨论】:
标签: bash newline line-breaks
添加此内容以供我参考 ^_^
您还可以使用 bash 扩展魔法从输出中删除一个新行
VAR=$'helloworld\n'
CLEANED="${VAR%$'\n'}"
echo "${CLEANED}"
【讨论】:
使用 awk:
awk -v ORS="" '1' log.txt
说明:
【讨论】:
如果您想在 Bash 中不带行尾地打印任何内容,请使用 -n 开关回显它。
如果您已经将它放在变量中,则使用裁剪后的trailing newline 回显它:
$ testvar=$(wc -l < log.txt)
$ echo -n $testvar
或者您可以在一行中完成:
$ echo -n $(wc -l < log.txt)
【讨论】:
echo -n $(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 coreutils 中的head 来选择除最后一个字节之外的所有内容。这应该很快:
head -c -1 log.txt
此外,为了完整起见,您可以使用cat 和“显示全部”标志-A 快速检查文件中的换行符(或其他特殊)字符的位置。美元符号字符将指示每一行的结尾:
cat -A log.txt
【讨论】:
tr --delete '\n'.
| tr -d '\r'
head -c ... 版本——因为我可以现在 将命令提供到剪贴板并保留格式,但最后一个\n。例如:alias clip="head -c -1 | xclip -selection clipboard",不要太破旧。现在,当您使用管道 ls -l | clip ... 所有精彩的输出都将发送到 X-Server clipboard,而没有终止 \n。因此...我可以将其粘贴到我的下一个命令中,就这样。非常感谢!
如果您想只删除最后一个换行符,请通过管道:
sed -z '$ s/\n$//'
如果分隔符通过-z 设置为NUL,sed 将不会在流的末尾添加\0,而创建 POSIX 文本文件(定义为以 \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+$//'
【讨论】:
sed 不提供 -z。
gsed 并使用它,doing what it says here
$ 是做什么的吗?
Bash variable substitution 中也直接支持删除空格:
testvar=$(wc -l < log.txt)
trailing_space_removed=${testvar%%[[:space:]]}
leading_space_removed=${testvar##[[:space:]]}
【讨论】:
trailing_linebreak_removed=${testvar%?}
一种方式:
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 版本中已被弃用,并且有许多缺点。
printf 已经为你裁剪了尾随换行符:
$ printf '%s' $(wc -l < log.txt)
详情:
%s 字符串占位符。 %s\n),它就不会。【讨论】:
"$(command)",内部换行符将被保留——并且只有 尾随 换行符将被删除。 shell 在这里完成了所有工作——printf 只是将命令替换结果返回到stdout 的一种方式。
$( ) 构造的 shell。这是证据:printf "%s" "$(perl -e 'print "\n"')"
$ printf '%s' "$(wc -l < log.txt)"
如果将其输出分配给变量,bash 会自动去除空格:
linecount=`wc -l < log.txt`
【讨论】: