You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:使用Bash脚本结合正则替换CDATA并提取指定值

处理CDATA值的Bash脚本解决方案

没问题,我来帮你搞定这个CDATA内容提取替换的需求!你已经找对了方向——用sed或者awk就能轻松实现,下面给你具体的实现方案和解释:

方案一:使用sed(推荐,简洁高效)

sed是处理文本替换的利器,启用扩展正则后可以轻松捕获目标数值。执行下面的命令即可完成替换:

sed -E 's/<!\[CDATA\[.*"original_image":"([0-9]+)".*\]\]>/<![CDATA[\1]]>/g' your_export_file.txt

命令解释:

  • -E:启用扩展正则表达式,这样我们不用对捕获括号()转义,写起来更清爽
  • s/匹配规则/替换内容/g:标准的sed替换语法,g表示全局替换(一行中有多个匹配时都会处理)
  • 匹配规则部分:<!\[CDATA\[.*"original_image":"([0-9]+)".*\]\]>
    • <!\[CDATA\[ 和 \]\]> 精准匹配CDATA的首尾标记(注意转义[和])
    • .* 匹配CDATA内部的任意内容(贪婪模式,会跳过所有直到找到"original_image")
    • ([0-9]+) 捕获"original_image"对应的数值,这就是我们要保留的内容
  • 替换内容部分:<![CDATA[\1]]>,\1引用前面捕获到的数值,把整个CDATA块替换成只包含该数值的新CDATA

方案二:使用awk(适合复杂文本场景)

如果你的导出文件有更复杂的格式,或者需要做额外的文本处理,awk会更灵活:

awk '{
    while(match($0, /<!\[CDATA\[.*"original_image":"([0-9]+)".*\]\]>/, capture_arr)) {
        sub(/<!\[CDATA\[.*"original_image":"[0-9]+".*\]\]>/, "<![CDATA[" capture_arr[1] "]]>", $0)
    }
    print
}' your_export_file.txt

命令解释:

  • match($0, 正则, capture_arr):在当前行中匹配正则,把捕获的组存入数组capture_arr,capture_arr[1]就是我们要的数值
  • sub(匹配规则, 替换内容, $0):把当前行中第一个匹配的内容替换掉,配合while循环处理一行中的所有匹配
  • 最后print输出处理后的行

测试示例

假设你的导出文件内容如下:

Sample line 1: <![CDATA[{"original_image":"9","cropped_image":15}]]>
Sample line 2: <![CDATA[{"cropped_image":22,"original_image":"123"}]]>

执行sed命令后,输出结果会是:

Sample line 1: <![CDATA[9]]>
Sample line 2: <![CDATA[123]]>

如果需要直接修改原文件,可以给sed加上-i参数(注意:这个操作会直接覆盖原文件,建议先备份):

sed -i -E 's/<!\[CDATA\[.*"original_image":"([0-9]+)".*\]\]>/<![CDATA[\1]]>/g' your_export_file.txt

内容的提问来源于stack exchange,提问作者mcorkum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 23:17:31