从字符串中的位置获取单词 - Bash / Linux

时间:2016-03-21 13:30:46

标签: linux bash

我有以下字符串,我想从中提取名称和ID,并将它们存储在变量中。这只是一个例子,列表可以更长,但它们以相同的方式分开。

[["freepbx","NEWUPDATES","There are 6 modules available for online upgrades"],["cidlookup","noauth","OpenCNAM Requires Authentication"]]

字符串中的id是freepbx和cidlookup,名称是NEWUPDATES和noauth。

我希望他们像:

一样出来
freepbx NEWUPDATES
cidlookup noauth

我从命令行运行程序需要它以这种方式输入。

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:1)

这是一种方法:

echo '[["freepbx","NEWUPDATES","There are 6 modules available for online upgrades"],["cidlookup","noauth","OpenCNAM Requires Authentication"]]' | sed -e 's/\],\[/\n/g' -e 's/\(\[\[\)*"//g' | awk -F ',' '{print $1, $2}'
freepbx NEWUPDATES
cidlookup noauth

<强>解释

sed命令s/\],\[/\n/g将替换所有使用新行(])字符分隔每条记录的[\n。这将允许您将每一行视为一个单独的记录,使所有其他工具更容易:)

第二个sed命令s/\(\[\[\)*"//g将删除第一条记录开头的引号和初始[[。这会从您的数据中清除内容,只在您的字段之间留下,

最后,awk命令-F ',' '{print $1, $2}'-F告诉awk使用,作为字段分隔符(而不是空格)和$1 }和$2打印第一个和第二个字段。

答案 1 :(得分:1)

awk救援!

$ awk -F'"' -v RS="\\\],\\\[" '{print $2,$4}' file

freepbx NEWUPDATES
cidlookup noauth

答案 2 :(得分:0)

如果jq可用:

jq -r '.[] | "\(.[0]) \(.[1])"'

管道.[](数组中的所有元素)输出仅打印第0个和第1个元素"\(.[0]) \(.[1])",如所需的输出。