背景:我正在将一些sql语句从SQL服务器移动到Oracle。虽然Oracle在字符串比较中区分大小写,但我认为SQL服务器不是。 在我的情况下,所有字符串必须是大写的。
原来我可能会有像这样的东西xyz like '%foo%' and ...
我要转换为
xyz like '%FOO%' and ...
即。 “喜欢”之后引号之间的任何内容都必须大写。
这是我尝试过但不起作用的内容:
echo "like 'aaa' aaa"|sed 's/like\( '.*'\)/like\U\1/g'
出于某种原因,这给了我
like 'AAA' AAA
我不明白为什么它与整条线匹配,即使是在第二次引用之后。
这也行不通:
echo "like 'aaa' aaa"|sed 's/like\( '[^']*\)/like\U\1/g'
为什么呢?我不理解错误消息sed: -e expression #1, char 26: unterminated 's' command
有什么想法吗?非常感谢!
答案 0 :(得分:3)
将bpms
与外部单引号一起使用时,您也不能在其中使用单引号...但是使用's/SEARCH/REPLACE/'
而不是
\x27
这两个是等效的,$ echo "like 'aaa' aaa"|sed 's/like\( \x27.*\x27\)/like\U\1/g'
like 'AAA' aaa
只是三个字符串连接's/like\( '.*'\)/like\U\1/g'
和's/like( '
以及.*
'\)/like\U\1/g'
此外,$ echo "like 'aaa' aaa" | sed 's/like\( '.*'\)/like\U\1/g'
like 'AAA' AAA
$ echo "like 'aaa' aaa" | sed 's/like\( .*\)/like\U\1/g'
like 'AAA' AAA
$ # a different example
$ echo "like 'aaa' aaa" | sed 's/like/'LIKE'/g'
LIKE 'aaa' aaa
会尝试尽可能匹配,因此请改用:
.*
VS
$ echo "xyz like '%foo%' and 'bar' ..." | sed 's/\(like[^\x27]*\x27\)\([^\x27]*\)/\1\U\2/g'
xyz like '%FOO%' and 'bar' ...
$ echo "xyz like '%foo%' and 'bar' ..." | sed 's/like\( \x27.*\x27\)/like\U\1/g'
xyz like '%FOO%' AND 'BAR' ...
匹配like[^\x27]*\x27
后跟非单引号字符和单引号字符like
然后我们匹配尽可能多的非单引号字符,然后在替换部分中使用[^\x27]*
答案 1 :(得分:1)
您可以使用双引号来保护单引号,如下所示:
echo "like 'aaa' aaa" | sed "s/like\( '[^']*'\)/like\U\1/g"
输出:
like 'AAA' aaa