2016-12-15 68 views
4

我想用一個sed命令替換爲第一個字母爲大寫。如何用一個sed命令先替換n個字母爲大寫

將「madrid」例化爲「MADrid」。 (N = 3)

我知道如何改變第一個字母使用此命令爲大寫:

sed -e "s/\b\(.\)/\U\1/g" 

,但我不知道如何改變這個命令我的問題。

我試圖改變

sed -e "s/\b\(.\)/\U\1/g" 

sed -e "s/\b\(.\)/\U\3/g" 

但這沒有工作。此外,我在這個網站上搜索和搜索,但確切的答案與我無法找到的問題。

謝謝。

+1

榮譽,這是一個完美的例子,任何初學者都可以看看如何問。 – sjsam

回答

4

我從你的使用\U推斷出你使用GNUsed

n=3 
echo 'madrid' | sed -r 's/\<(.{'"$n"'})/\U\1/g' # -> 'MADrid' 
  • 我省略了不必要的-e選項
  • 我已經加入-r啓用支持擴展了正則表達式,它具有更熟悉的語法並提供更多功能。
  • 我使用單引號sed腳本與拼接,以便一個shell變量值避免什麼之間的外殼擴展了前面,什麼是sed自身解釋的混亂。

  • \<代替\b,因爲與後者不同的是隻在一個單詞的開始匹配。 謝謝,Casimir et Hippolyte

在一個單詞的開始上述替換任何3個字符,但是。

將其限制在最多$n字母

sed -r 's/\<([[:alpha:]]{1,'"$n"'})/\U\1/g' 

至於你已經嘗試過什麼:

\3在你嘗試sed -e "s/\b\(.\)/\U\3/g"3捕獲組(加括號的子表達式,(...))在re gex(不存在),它確實是而不是是指3次重複。

相反,您必須確保您的唯一一個捕獲組(您可以在替換中引用爲\1)捕獲儘可能多的字符 - 這是量化器的用途;相關的{<m>,<n>}構造匹配重複的範圍

+2

*「...並且還提供了更多特徵」*:特別是邊界詞\ b',但是注意使用'\ <'代替'\ b'可能更精確,特別是如果字符串包含更多至少有一個單詞與至少n個非單詞字符分開(或者因爲使用'{1,n}'而少)。但這並不重要,因爲這些非單詞字符沒有情況。 –

+0

@CasimiretHippolyte:好點,謝謝 - 答案更新。 – mklement0

0

這可能爲你工作(GNU SED):

sed -r 's/[a-z]/&\n/'"$n"';s/^([^\n]*)\n/\U\1/' file 

哪裏$n是第N個字母。除了字邊界的問題,這個轉換na-z字母連續或不連續的大寫,即A-Z

N.B.這是兩個sed命令不是一個!

相關問題