我的代码是
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循环打印此数据和另外两个数组。
我怎样才能做到这一点?
答案 0 :(得分:1)
我正在对来自小样本的数据做出假设,但我们可以从这里开始,如果其中一些假设不太好,你可以告诉我。主要想法是在阅读带有开头引号的行后不打印新行:
$ 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
}
答案 1 :(得分:1)
虽然我同意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"
答案 2 :(得分:0)
在我的第一次尝试中,我错过了你的观点。这是我的更正。
你可以试试这个:
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[@]}"
更安全。
另一方面,最好在awk内部实施jas
。如果您使用arr
进行其他操作,那么这可能是一个合适的解决方案。
如果输入文件很小,可以在bash内实现。
我认为使用的模式"*"
不是您想要使用的模式。此检查发现零{或}次"
后跟"
。我想您想查看".*"
或"[^"]*"
或类似的内容......