要格式化数以千计的SQL查询,我需要将所有不在引号对中的字符转换为大写字母。
例如:
select * from region where regionkey = 'America'
转换为
SELECT * FROM REGION WHERE REGIONKEY = 'America'
使用perl,我可以通过以下方式将引用的字符转换为大写:
perl -p -e 's/('.+?')/\U\1/g'
并获得:
select * from region where regionkey = 'AMERICA'
问题是如何“反转”捕获结果,比如说,不要用引号进行游戏?
答案 0 :(得分:1)
s/([^']*)('[^']*'|\z)/\U$1\E$2/g
所以
perl -pe's/([^'\'']*)('\''[^'\'']*'\''|\z)/\U$1\E$2/g'
ysth建议使用混合报价方法:
perl -pe"s/([^']*)('[^']*'|\z)/"'\U$1\E$2/g'
如果引号中可以包含反斜杠转义,请更改
'[^']*'
到
'(?:[^'\\]+|\\.)*'
答案 1 :(得分:0)
在引用的子串上拆分字符串,并在每个其他块上大写。喜欢这个
my $str = "select * from region where regionkey = 'America'";
my $uc;
$str = join '', map { ($uc = !$uc) ? uc : $_ } split /('[^']*')/, $str;
print $str;
<强>输出强>
SELECT * FROM REGION WHERE REGIONKEY = 'America'