【问题标题】:How to print output of bash array on single line如何在单行上打印bash数组的输出
【发布时间】:2016-04-21 03:46:37
【问题描述】:

我的代码是

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

我怎样才能做到这一点?

【问题讨论】:

  • '/"*"/' 绝对不会像您认为的那样做。那是有效地检查一行上是否存在单引号,然后打印该行。
  • 是的,你是对的,但考虑到我的 puppet 文件的格式,这似乎可行。关于如何匹配引号并在它们之间打印任何内容的任何想法?
  • 你为什么不给我们看一个output.txt的样本?
  • 确定@TomFenech 在我的问题中更新它
  • 也向我们展示for 循环;这很明显是有问题的。

标签: arrays linux bash awk grep


【解决方案1】:

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

你可以试试这个:

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

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

我认为使用的模式"*" 不是您打算使用的。此检查是否出现零次或多次 ",后跟 "。我想你想检查 ".*""[^"]*" 或类似的东西......

【讨论】:

  • 嗨,我已经在 for 循环中使用了这个 echo,抱歉会更新我的问题
【解决方案2】:

我正在对给出的小样本中的数据进行假设,但我们可以从这里开始,如果其中一些假设不太好,您可以告诉我。主要思想是在阅读带有开头引号的行后不打印新行:

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

【讨论】:

  • 这无疑为我指明了正确的方向。我已经使用了你的命令加上 tr 命令并且成功了 - 这对我有用 --> awk '/^"/ { printf $0 " "; next } sub(/",$/, "\"")' 输出。 txt|tr '""' '\n'
【解决方案3】:

虽然我同意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"

【讨论】:

    猜你喜欢
    • 2017-02-20
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 2022-01-07
    • 2021-07-10
    相关资源
    最近更新 更多