如何将那些未引用的字符转换为大写?

时间:2013-03-04 04:04:44

标签: regex perl shell

要格式化数以千计的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'

问题是如何“反转”捕获结果,比如说,不要用引号进行游戏?

2 个答案:

答案 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'