我有一个在哪里Unix 文件中的子句字符串如下
where c1 in (a) and c2 in (a,b,c) and c3 in ()
需要输出为
where c1 in ('a') and c2 in ('a','b','c') and c3 in ('')
如果有人能完成这个就太好了。
答案1
sed -r "s/,/','/g; s/\(([^)]+)\)/('\1')/g"
让我们看看这如何改变您提供的输入:
where c1 in (a) and c2 in (a,b,c) and c3 in ()
首先,逗号用引号 ( s/,/','/g
) 括起来:
where c1 in (a) and c2 in (a','b','c) and c3 in ()
然后我们在非空括号 ( s/\(([^)]+)\)/('\1')/g
) 内添加引号:
where c1 in ('a') and c2 in ('a','b','c') and c3 in ()
...这就是您想要的输出。
请小心,因为此正则表达式可能会以您不希望的方式影响其他行。
答案2
您还可以使用循环来完成此操作:
sed -e ':top' -e 's/\([(,]\)\([^),'\'']\{1,\}\)\([),]\)/\1'"'\2'"'\3/;t top'
或者,使用-E
:
sed -E -e ':top' -e "s/([(,])([^),']+)([),])/\1'\2'\3/;t top"
答案3
如果您的文件中唯一的内容是帖子中描述的 WHERE 子句,那么应该执行以下操作:
$ sed -r "s/(\(|,)([^ ),]+)(\)|,)/\1'\2'\3/g" <Filename>
where c1 in ('a') and c2 in ('a',b,'c') and c3 in ()
如果您的文件充满其他数据,例如该 SQL 语句的其余部分或多个 SQL 语句,则这可能会干扰该文件中的其他文本。由于sed
没有lookbehind/lookahead功能,您可能会考虑更安全的替代方案perl
(如果您的WHERE子句与每个SQL语句的其余部分位于不同的行):
$ perl -ne "s/(\(|,)([^ ),]+)(\)|,)/\1'\2'\3/g if /where/; print;" <Filename>
where c1 in ('a') and c2 in ('a',b,'c') and c3 in ()