1

我有一个以这种格式输出的命令:

A
B
C
D
E
F
G
I
J

等我希望输出采用这种格式

A B C D E F G I J

我尝试使用./script | tr "\n" " ",但它所做的只是n从输出中删除如何在一行中获取所有输出。(绕线)

编辑:我在提问时不小心输入了 grep 。我删除了它。我原来的问题仍然存在。

4

4 回答 4

4

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 $
于 2012-07-05T05:27:18.243 回答
1

正如 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 fmtinfo fmt)了解详细信息。

于 2012-07-05T05:39:36.987 回答
0

不需要使用其他程序,为什么不使用 Bash 来完成这项工作?(--在编辑中添加)

line=$(./script.sh) 
set -- $line
echo "$*"

set设置命令行选项,其中一个(默认情况下)分隔符是“\n” 。编辑:这将覆盖任何现有的命令行参数,但良好的编码习惯会建议您在脚本的早期将这些重新分配给命名变量。

当我们使用(注意引号)时,它使用第一个字符作为胶水"$*"再次将它们连接在一起。默认情况下,这是一个空格。IFS

tr是一个不必要的子进程。

顺便说一句,有一个名为 的命令script,因此请小心使用该名称。

于 2012-07-05T08:28:37.363 回答
0

如果我没记错的话,当它的参数被赋予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变量将不包含换行符。

于 2012-07-06T09:27:50.670 回答