繁体   English   中英

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

[英]How to print output of bash array on single line

我的代码是

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循环来打印此数组和其他两个数组。

我该如何实现?

我正在根据给定的小样本中的数据进行假设,但是我们可以从这里开始,您可以让我知道其中一些假设不是很好。 主要思想是在阅读带有引号的行后不打印新行:

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

将为您给定的输入文件提供相同的输出,例如:

$ bash merge2l.sh file.txt
"John Smith"
"Abc Xyz"

在我的第一次尝试中,我错过了您的观点。 这是我的更正。

您可以尝试以下方法:

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进行其他操作,那么这可能是一个合适的解决方案。

如果输入文件很小,则可以在实现。

我认为使用的模式"*"不是您要使用的模式。 此检查是否出现零个或多个"后跟" 我认为您想检查".*""[^"]*"或类似的内容...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM