如何在含_binary的SQL行中替换其后方首个',为')
解决sed仅替换
_binary之后首个',的问题 先看原始SQL内容:
INSERT INTO asdassd (3,_binary 'asdfsdfsdf\"/>',-1234); INSERT INTO hfhdfghdf (1476,'ghdfsdfg','sdfgdfgsdf',-1234); INSERT INTO retfdxfsd (1476,'xdfgthb',_binary 'nghfghgfh',-1234);
需求很明确:只在包含_binary的行里,把_binary之后出现的第一个',替换成'),。
你之前的命令sed -i "/_binary/{s/',/'),/}" file之所以失效,是因为它会直接替换整行里的第一个',,完全没考虑_binary的位置——比如第三行里_binary前面已经有一个',,就会错误替换前面的内容。
给你两个精准的解决方案:
方案1:基于_binary位置的全局捕获
sed -i "/_binary/{s/\(_binary.*\)',/\1'),/}" file
这个命令的逻辑是:
- 先筛选出包含
_binary的行; - 用
\(_binary.*\)'捕获从_binary开始到目标',前的所有内容; - 把捕获到的内容保留,只把后面的
',替换成'),。
方案2:针对SQL字符串的精准匹配
如果你的SQL里_binary后面都是标准的'字符串'格式,用这个更稳妥:
sed -i "/_binary/{s/\(_binary '[^']*'\),/\1'),/}" file
这个写法专门匹配_binary '开头的字符串,直到遇到闭合的',然后把后面的逗号改成'),,彻底避免行内其他',的干扰,适合处理SQL这类有明确字符串格式的场景。
替换后的第三行应该变成:
INSERT INTO retfdxfsd (1476,'xdfgthb',_binary 'nghfghgfh'),-1234);
内容的提问来源于stack exchange,提问作者felix
相关产品推荐
相关产品推荐

