【问题标题】:Search and replace CDATA with regex使用正则表达式搜索和替换 CDATA
【发布时间】:2020-03-19 13:35:23
【问题描述】:

我正在尝试创建一个 bash 脚本,该脚本查看一些导出文件并对一些 CDATA 值进行搜索和替换。我需要从现有字符串中提取一个值,并将其替换为包含该值的新字符串。

例如:

  • 搜索:<![CDATA[{"original_image":"9","cropped_image":15}]]>

  • 替换为:<![CDATA[9]]>

  • 其中被替换的字符串包含来自 "original_image":"9"

我很擅长正则表达式,我可以通过以下方式获得所需的价值:^[^\d]*(\d+)

我只是不确定如何做剩下的事情,我假设我用sedawk 来做这件事。再次感谢任何愿意提供帮助的人。

【问题讨论】:

  • 没有标准的 UNIX 工具能够理解 \d 的含义。如果你想匹配一个数字然后使用[0-9],
  • 很高兴知道!谢谢!

标签: regex linux awk sed


【解决方案1】:

你可以使用

sed -i 's/\(<!\[CDATA\[\)[^][]*"original_image":"\([0-9]*\)[^][]*\(]]>\)/\1\2\3/g' file

online demo

s='<![CDATA[{"original_image":"9","cropped_image":15}]]>'
sed 's/\(<!\[CDATA\[\)[^][]*"original_image":"\([0-9]*\)[^][]*\(]]>\)/\1\2\3/g' <<< "$s"
# => <![CDATA[9]]>

详情

  • \(&lt;!\[CDATA\[\) - 第 1 组:&lt;![CDATA[ 子字符串
  • [^][]* - 除了 [] 之外还有 0+ 个字符
  • "original_image":" - 文字子字符串
  • \([0-9]*\) - 第 2 组:零个或多个数字
  • [^][]* - 除了 [] 之外的 0+ 个字符
  • \(]]&gt;\) - 第 3 组:]]&gt; 子字符串

\1\2\3 替换模式是三个组值的串联。

【讨论】:

  • 太棒了。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2013-06-14
  • 2013-11-30
  • 1970-01-01
  • 2018-05-25
  • 2010-11-25
  • 2010-10-30
  • 1970-01-01
相关资源
最近更新 更多