Sed将两个字符串之间的小写字符串替换为大写字母

时间:2014-03-28 16:40:50

标签: regex bash sed

我有一个文本文件如下。我想将foovar之间的较低字符串更改为大写。

foo nsqlnqnsslkqn var
lnlnl.
foo DkqdQ HNOQii var

我的预期输出是

foo NSQLNQNSSLKQN var
lnllnl.
foo DKQDQ HNOQII var

我使用sed sed 's/\(\foo\).*\(\var\)/\U\1\2/' testfile.txt使用了一个班轮 但我得到以下输出

FOOVAR
lnlnl.
FOOVAR

1 个答案:

答案 0 :(得分:11)

您可以使用\U将某些内容变为大写:

$ sed 's/.*/\U&/' <<< "hello"
HELLO

\E停止转换:

$ sed -r 's/(..)(..)(.)/\U\1\E\2\U\3/' <<< "hello"
HEllO

在您的情况下,只需抓住这些块并相应地放置\U\E

$ sed -r 's/(foo )(.*)( var)/\1\U\2\E\3/' file
foo NSQLNQNSSLKQN var
lnlnl.
foo DKQDQ HNOQII var
  • (foo )(.*)( var)抓住三个街区:foo,下一个文字和var
  • \1\U\2\E\3打印它们,向上打印(是动词吗?)第二个(\U)并使用当前大小写(\E)作为第三个。

如果没有-r,请使其与您当前的方法更相似:

sed 's/\(foo \)\(.*\)\( var\)/\1\U\2\E\3/' file

因此,您可以看到自己没有抓住.*块,因此您只是打印foovar


来自the manual of sed

  

\ L 将替换为小写,直到找到\ U或\ E,

     

\ l 将下一个字符设为小写,

     

\ U 将替换为大写,直到找到\ L或\ E,

     

\ u 将下一个字符设为大写,

     

\ E 停止通过\ L或\ U开始大小写转换。