Arrays 如何在单行上打印bash数组的输出

Arrays 如何在单行上打印bash数组的输出,arrays,linux,bash,awk,grep,Arrays,Linux,Bash,Awk,Grep,我的代码是 arr=($(awk '/"*"/' output.txt)) output.txt表示有以下内容- user { 'xx123': comment => "John Smith", groups => $groups, id => '1234', 这是搜索我的目标文件中的所有用户名。它搜索包含引号的所有内容,并存储在数组arr中 电流输出: "John Smith", "Abc Xyz", ".

我的代码是

arr=($(awk '/"*"/' output.txt)) 
output.txt表示有以下内容-

user  
{  
'xx123':  
comment
=>  
"John  
Smith",  
groups  
=>  
$groups,  
id  
=>  
'1234',  
这是搜索我的目标文件中的所有用户名。它搜索包含引号的所有内容,并存储在数组arr中

电流输出:

"John  
Smith",  
"Abc  
Xyz",  
"...  
...",
但我想做到这一点:

"John Smith"  
"Abc Xyz"
目前正在使用for循环打印此数组和其他两个数组


我怎样才能做到这一点呢?

在第一次尝试中,我没有抓住你的重点。这是我的更正

您可以尝试以下方法:

printf "%s %s\n" "${arr[@]}"
例如:

$ set|grep BASH_VERSINFO
BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i686-redhat-linux-gnu")
$ printf "%s %s\n" "${BASH_VERSINFO[@]}"
3 2
25 1
release i686-redhat-linux-gnu
我希望这就是你想要的

如果数组元素中没有空间,则可以使用${BASH_VERSINFO[@]}或${BASH_VERSINFO[*]},但${BASH_VERSINFO[@]}更安全

另一方面,最好像jas提到的那样在内部实现。如果您使用arr进行其他操作,那么这可能是一个合适的解决方案

如果输入文件很小,可以在内部实现


我认为使用的模式*不是您想要使用的。此检查是否有零次或多次出现,然后是。我想你想检查一下。*或[^]*或类似的东西…

我正在对给出的小样本数据进行假设,但我们可以从这里开始,如果其中一些假设不太好,你可以让我知道。主要思想是在阅读了一行开头有引语的内容后,不要再打印新行:

$  awk '/^"/ { printf "%s ", $0; next } sub(/",$/, "\"")' output.txt
"John Smith"
"Abc Xyz"

$ cat output.txt
user
{
'xx123':
comment
=>
"John
Smith",
groups
=>
$groups,
id
=>
'1234',
=>
"Abc
Xyz",
groups
}
虽然我同意awk解决方案可能是处理这种情况的最短方法,但使用bash内置的比较、字符串索引和参数扩展子字符串删除也可以做到这一点。例如:

#!/bin/bash

first=""
while read -r last; do 
    [ "${last:0:1}" = '"' ] && first="$last"
    [ "${last:(-2)}" = '",' ] && printf "%s %s\n" "$first" "${last%,}"
done <"$1"

“/*/”绝对不是你想象的那样。这有效地检查了一行中是否存在一个引用,然后打印该行。是的,你是对的,但是考虑到我的puppet文件的格式,这似乎是可行的。你知道如何匹配引号并打印它们之间的任何内容吗?为什么不给我们看一个output.txt的示例?好的,当然@TomFenech在我的问题中更新它,也给我们看for循环;这很明显是错误的。嗨,我已经在for循环中使用了这个echo,抱歉,我会更新我的问题,这肯定为我指明了正确的方向。我已经使用了您的命令加上tr命令,并且已经成功-这对我来说很有用->awk'/^/{printf$0;next}sub/,$/,\'output.txt | tr''\n
$ bash merge2l.sh file.txt
"John Smith"
"Abc Xyz"