![使用 sed 在文本文件中插入单引号,用作在左括号后面的 SQL 查询](https://linux22.com/image/6832/%E4%BD%BF%E7%94%A8%20sed%20%E5%9C%A8%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E4%B8%AD%E6%8F%92%E5%85%A5%E5%8D%95%E5%BC%95%E5%8F%B7%EF%BC%8C%E7%94%A8%E4%BD%9C%E5%9C%A8%E5%B7%A6%E6%8B%AC%E5%8F%B7%E5%90%8E%E9%9D%A2%E7%9A%84%20SQL%20%E6%9F%A5%E8%AF%A2.png)
我有一个在哪里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 ()