使用 sed 在文本文件中插入单引号,用作在左括号后面的 SQL 查询

使用 sed 在文本文件中插入单引号,用作在左括号后面的 SQL 查询

我有一个在哪里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 ()

相关内容