0

要格式化数千个 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'

问题是如何“反转”捕获结果,例如,前进到不在引号中?

4

2 回答 2

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'

如果引号中可以有反斜杠转义,请更改

'[^']*'

'(?:[^'\\]+|\\.)*'
于 2013-03-04T04:17:33.257 回答
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'
于 2013-03-04T04:49:35.363 回答