2014-03-28 93 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或\ü開始Ë停止大小寫轉換。

相關問題