2014-03-28 37 views
3

我有一个文本文件,如下所示。我想将foovar之间的较低字符串更改为大写。Sed将两个字符串之间的小写字符串替换为大写字母

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 
+0

看看你的'sed'表达式并尝试观察各个捕获组,并且你可能能够计算出你得到的输出! – devnull

回答

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

\大号转动替换为小写直到\ U或\ E被发现,

\升打开下一个字符为小写,

\ U将替换为大写unt IL一\ L或\ E被发现,

打开下一个字符为大写,

\由\ L或\ü开始Ë停止大小写转换。

相关问题