shell 如何在bash中连接输出中的行?

unhi4e5o  于 2023-05-07  发布在  Shell
关注(0)|答案(4)|浏览(134)

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

A
B
C
D
E
F
G
I
J

etc我希望输出为这种格式

A B C D E F G I J

我尝试使用./script | tr "\n" " ",但它所做的只是从输出中删除n如何在一行中获得所有输出。
编辑:我在问问题时不小心放进了grep。我把它拿掉了。我原来的问题仍然存在。

pgky5nke

pgky5nke1#

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 $
wj8zmpe1

wj8zmpe12#

正如Jonathan Leffler指出的,你不想要grep。您正在使用的命令:

./script | grep tr "\n" " "

甚至不调用tr命令;它应该在名为"\n"" "的文件中搜索模式"tr"。由于这不是您报告的输出,我怀疑您输入了错误的命令。
你可以这样做:

./script | tr '\n' ' '

但是(a)它将所有输入连接到一行中,并且(b)它不会在行尾追加新行。通常,这意味着您的shell提示符将打印在输出行的末尾。
如果你想把所有东西都放在一行上,你可以这样做:

./script | tr '\n' ' ' ; echo ''

或者,如果您希望将输出 Package 为合理的宽度:

./script | fmt

fmt命令有许多选项来控制诸如最大行长度之类的事情;详细信息请阅读其文档(man fmtinfo fmt)。

vc9ivgsu

vc9ivgsu3#

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

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

set设置命令行选项,其中一个(默认)分隔符是“\n”。编辑:这将覆盖任何现有的命令行参数,但良好的编码实践会建议您在脚本的早期将这些参数重新分配给命名变量。
当我们使用"$*"(注意引号)时,它再次使用IFS的 * 第一个字符 * 作为粘合剂将它们连接在一起。默认情况下,它是一个空格。
tr是不必要的子进程。
顺便说一下,有一个名为script的命令,所以要小心使用这个名称。

rta7y2nd

rta7y2nd4#

如果我没有弄错的话,echo命令将在其参数为 unquoted 时自动删除换行符:

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变量将不包含换行符。

相关问题