【问题标题】:sed - address space between "{" and "},"sed - “{”和“}”之间的地址空间,
【发布时间】:2016-07-20 19:48:34
【问题描述】:

我在 sed 中指定了“{”和“}”之间的地址空间,所以我希望只有第一个“Acer”被替换为“TTTT”。预计不会出现第二个。我该如何解决这个问题? 我在 Ubuntu 15.10 上进行了测试,sed 版本是 sed (GNU sed) 4.2.2。

提前致谢。

$ echo "
[
    {
        \"manufacturer\": \"Acer\",
        \"regularPrice\": 165.99,
    },
    [
        \"manufacturer\": \"Acer\",
        \"regularPrice\": 165.99,
    ],
    {
        \"manufacturer\": \"Acer\",
        \"regularPrice\": 165.99,
    }
]
" | sed "/{/,/},/ {s/\"Acer\"/\"TTTT\"/}"

其结果如下:

[
  {
    "manufacturer": "TTTT",
    "regularPrice": 165.99,
  },
  [
    "manufacturer": "Acer",
    "regularPrice": 165.99,
  ],
  {
    "manufacturer": "TTTT",
    "regularPrice": 165.99,
  }
]

【问题讨论】:

  • 地址中的第二个模式表示“找到时停止”。这并不意味着“如果没有找到就不要继续”。

标签: regex bash ubuntu sed


【解决方案1】:
echo '
[
    {
        "manufacturer": "Acer",
        "regularPrice": 165.99,
    },
    [
        "manufacturer": "Acer",
        "regularPrice": 165.99,
    ],
    {
        "manufacturer": "Acer",
        "regularPrice": 165.99,
    }
]
' | perl -0777 -pe 's/({[^}]*)"Acer"([^{]*?},)/$1"TTTT"$2/gs'

我在这里使用了 perl v5.16.3,它返回以下内容:

[
    {
        "manufacturer": "TTTT",
        "regularPrice": 165.99,
    },
    [
        "manufacturer": "Acer",
        "regularPrice": 165.99,
    ],
    {
        "manufacturer": "Acer",
        "regularPrice": 165.99,
    }
]

注意:

  • -0777 吞下整个文件
  • -p 循环并打印它们
  • -e 命令行中的代码
  • 全局替换 (s///) (g) 并允许通配符匹配换行符 (s)

【讨论】:

    【解决方案2】:

    这仅适用于GNU sed

    sed "/{/,/},/ {0,/\"Acer\"/ s/\"Acer\"/\"TTTT\"/}"
    

    或者更准确地说,以下也有效

    sed "/{/,/},/ {0,/\"Acer\"/s//\"TTTT\"/}"
    

    【讨论】:

      猜你喜欢
      • 2019-01-26
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 2019-11-06
      • 1970-01-01
      • 2012-04-21
      相关资源
      最近更新 更多