我有一个以这种格式输出的命令:
A
B
C
D
E
F
G
I
J
等我希望输出采用这种格式
A B C D E F G I J
我尝试使用./script | tr "\n" " "
,但它所做的只是n
从输出中删除如何在一行中获取所有输出。(绕线)
编辑:我在提问时不小心输入了 grep 。我删除了它。我原来的问题仍然存在。
grep
是多余的。
这应该有效:
./script | tr '\n' ' '
它为我做了一个命令al
,该命令每行列出一个参数:
$ al A B C D E F G H I J
A
B
C
D
E
F
G
H
I
J
$ al A B C D E F G H I J | tr '\n' ' '
A B C D E F G H I J $
正如 Jonathan Leffler 指出的那样,您不想要grep
. 您正在使用的命令:
./script | grep tr "\n" " "
甚至不调用tr
命令;它应该"tr"
在名为"\n"
and的文件中搜索模式" "
。由于这不是您报告的输出,我怀疑您输入了错误的命令。
你可以这样做:
./script | tr '\n' ' '
但是(a)它将所有输入连接到一行中,并且(b)它不会在行尾附加换行符。通常这意味着您的 shell 提示符将打印在输出行的末尾。
如果您希望所有内容都集中在一条线上,则可以执行以下操作:
./script | tr '\n' ' ' ; echo ''
或者,如果您希望输出包装到合理的宽度:
./script | fmt
该fmt
命令有许多选项来控制最大行长度等内容;阅读其文档(man fmt
或info fmt
)了解详细信息。
不需要使用其他程序,为什么不使用 Bash 来完成这项工作?(--
在编辑中添加)
line=$(./script.sh)
set -- $line
echo "$*"
set
设置命令行选项,其中一个(默认情况下)分隔符是“\n” 。编辑:这将覆盖任何现有的命令行参数,但良好的编码习惯会建议您在脚本的早期将这些重新分配给命名变量。
当我们使用(注意引号)时,它使用第一个字符作为胶水"$*"
再次将它们连接在一起。默认情况下,这是一个空格。IFS
tr
是一个不必要的子进程。
顺便说一句,有一个名为 的命令script
,因此请小心使用该名称。
如果我没记错的话,当它的参数被赋予unquotedecho
时,该命令将自动删除换行符:
tmp=$(./script.sh)
echo $tmp
结果是
A B C D E F G H I J
然而
tmp=$(./script.sh)
echo "$tmp"
结果是
A
B
C
D
E
F
G
H
I
J
如果需要,您可以将命令的输出重新分配echo
给另一个变量:
tmp=$(./script.sh)
tmp2=$(echo $tmp)
然后该$tmp2
变量将不包含换行符。