我有一个文本文件如下。我想将foo
和var
之间的较低字符串更改为大写。
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 :(得分: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
因此,您可以看到自己没有抓住.*
块,因此您只是打印foo
和var
。
\ L 将替换为小写,直到找到\ U或\ E,
\ l 将下一个字符设为小写,
\ U 将替换为大写,直到找到\ L或\ E,
\ u 将下一个字符设为大写,
\ E 停止通过\ L或\ U开始大小写转换。