使用sed在引号之间大写字符串

时间:2017-03-22 16:03:20

标签: unix sed

背景:我正在将一些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

有什么想法吗?非常感谢!

2 个答案:

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