求助:使用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
相关产品推荐
相关产品推荐

