将每个匹配添加到自己的行

时间:2014-10-03 20:39:42

标签: regex bash awk sed

我有这个

awk -F=":" -v RS="," '$1~/"name"/ {print}' | sed -e 's/^.*"name"[ ]*:[ ]*"//' -e 's/".*//'`

user1 user2 user3 user4 user5

我正在尝试添加一种在自己的行上创建每个匹配的方法,而不是并排

user1
user2 
user3 
user4 
user5

对于奖金,有没有办法告诉awk和sed跳过“名字”的第一场比赛?

这是api的输出

{
  "name": "users",
  "self": "http://",
  "users": {
    "size": 5,
    "items": [
      {
        "self": "http://",
        "name": "admin",
        "emailAddress": "admin@example.com",
        "avatarUrls": {

        },
        "displayName": "admin",
        "active": true
      },
      {
        "self": "http://",
        "name": "user1",
        "emailAddress": "user1@example.com",
        "avatarUrls": {

        },
        "displayName": "user1",
        "active": true
      },
      {
        "self": "http://",
        "name": "user2",
        "emailAddress": "user2@example.com",
        "avatarUrls": {

        },
        "displayName": "user2",
        "active": true
      },
      {
        "self": "http://",
        "name": "user3",
        "emailAddress": "user3@example.com",
        "avatarUrls": {

        },
        "displayName": "user3",
        "active": true
      }
    ],
    "max-results": 50,
    "start-index": 0,
    "end-index": 3
  },
  "expand": "users"
}

2 个答案:

答案 0 :(得分:2)

仅使用awk来解释样本json数据:

$ awk -F: -v RS="," '$1~/"name"/ && f {gsub("[ \",]", "", $2); print $2} $1~/"name"/{f=1}' json
admin
edwin
niwde
other

由于标记为name,因此会跳过f的第一个匹配。

awk代码的说明:

  • $1~/"name"/ && f {gsub("[ \",]", "", $2); print $2}

    这包括一个条件和一组语句。条件要求第一个字段匹配"name" 标记f非零。如果满足这两个条件,则从同一第二个字段中删除空格,引号和逗号,并打印第二个字段。

    awk中,变量的默认值为零(或空白)。因此,在我们为f指定非零值之前,不会打印任何内容。

  • $1~/"name"/{f=1}

    如果第一个字段与"name"匹配,则标记f设置为1。因此,在看到第一个名称字段之后,f才会设置为1。因此,第一个名称字段将不会被打印,但会被打印出来。

答案 1 :(得分:2)

你可以试试这个sed

sed -n '/"name": "/{s/ *"name": "\([^"]*\)",/\1/;p}' YourFile