我有一个命令,它以这种格式输出:
A B C D E F G I J
etc我希望输出为这种格式
我尝试使用./script | tr "\n" " ",但它所做的只是从输出中删除n如何在一行中获得所有输出。编辑:我在问问题时不小心放进了grep。我把它拿掉了。我原来的问题仍然存在。
./script | tr "\n" " "
n
pgky5nke1#
grep是多余的。这应该可以工作:
grep
./script | tr '\n' ' '
它为我做了一个命令al,每行列出一个参数:
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 $
wj8zmpe12#
正如Jonathan Leffler指出的,你不想要grep。您正在使用的命令:
./script | grep tr "\n" " "
甚至不调用tr命令;它应该在名为"\n"和" "的文件中搜索模式"tr"。由于这不是您报告的输出,我怀疑您输入了错误的命令。你可以这样做:
tr
"\n"
" "
"tr"
但是(a)它将所有输入连接到一行中,并且(b)它不会在行尾追加新行。通常,这意味着您的shell提示符将打印在输出行的末尾。如果你想把所有东西都放在一行上,你可以这样做:
./script | tr '\n' ' ' ; echo ''
或者,如果您希望将输出 Package 为合理的宽度:
./script | fmt
fmt命令有许多选项来控制诸如最大行长度之类的事情;详细信息请阅读其文档(man fmt或info fmt)。
fmt
man fmt
info fmt
vc9ivgsu3#
不需要使用其他程序,为什么不使用Bash来完成这项工作?(--已添加到编辑中)
--
line=$(./script.sh) set -- $line echo "$*"
set设置命令行选项,其中一个(默认)分隔符是“\n”。编辑:这将覆盖任何现有的命令行参数,但良好的编码实践会建议您在脚本的早期将这些参数重新分配给命名变量。当我们使用"$*"(注意引号)时,它再次使用IFS的 * 第一个字符 * 作为粘合剂将它们连接在一起。默认情况下,它是一个空格。tr是不必要的子进程。顺便说一下,有一个名为script的命令,所以要小心使用这个名称。
set
"$*"
IFS
script
rta7y2nd4#
如果我没有弄错的话,echo命令将在其参数为 unquoted 时自动删除换行符:
echo
tmp=$(./script.sh) echo $tmp
导致
A B C D E F G H I J
而
tmp=$(./script.sh) echo "$tmp"
如果需要,您可以将echo命令的输出重新分配给另一个变量:
tmp=$(./script.sh) tmp2=$(echo $tmp)
然后,$tmp2变量将不包含换行符。
$tmp2
4条答案
按热度按时间pgky5nke1#
grep
是多余的。这应该可以工作:
它为我做了一个命令
al
,每行列出一个参数:wj8zmpe12#
正如Jonathan Leffler指出的,你不想要
grep
。您正在使用的命令:甚至不调用
tr
命令;它应该在名为"\n"
和" "
的文件中搜索模式"tr"
。由于这不是您报告的输出,我怀疑您输入了错误的命令。你可以这样做:
但是(a)它将所有输入连接到一行中,并且(b)它不会在行尾追加新行。通常,这意味着您的shell提示符将打印在输出行的末尾。
如果你想把所有东西都放在一行上,你可以这样做:
或者,如果您希望将输出 Package 为合理的宽度:
fmt
命令有许多选项来控制诸如最大行长度之类的事情;详细信息请阅读其文档(man fmt
或info fmt
)。vc9ivgsu3#
不需要使用其他程序,为什么不使用Bash来完成这项工作?(
--
已添加到编辑中)set
设置命令行选项,其中一个(默认)分隔符是“\n”。编辑:这将覆盖任何现有的命令行参数,但良好的编码实践会建议您在脚本的早期将这些参数重新分配给命名变量。当我们使用
"$*"
(注意引号)时,它再次使用IFS
的 * 第一个字符 * 作为粘合剂将它们连接在一起。默认情况下,它是一个空格。tr
是不必要的子进程。顺便说一下,有一个名为
script
的命令,所以要小心使用这个名称。rta7y2nd4#
如果我没有弄错的话,
echo
命令将在其参数为 unquoted 时自动删除换行符:导致
而
导致
如果需要,您可以将
echo
命令的输出重新分配给另一个变量:然后,
$tmp2
变量将不包含换行符。