2017-04-24 22 views
4

我有一個文本文件與一列數據。以下面的數據爲例正則表達式和/或sed來代替小寫

united states 
germany 
france 
canada 

其中我試圖產生所有可能的混合大小寫變化。例如,新的文件可能是這樣的

United states 
uNited states 
unIted states 
uniTed states 
unitEd states 
uniteD stated 
united States 
united sTates 
united stAtes 
united staTes 
united statEs 
united stateS 
UNited states 

依此類推,直到每個字的所有可能的情況下的變化已經產生。

鑑於上述輸入和預期的輸出我有三個問題

  1. 是正則表達式和sed這個工作的工具?
  2. 我有什麼替代方案可以用於這個任務的正則表達式和sed?
  3. 如果我確實使用了正則表達式和sed,那麼正確的語法是什麼樣子?
+0

中的描述和示例輸出似乎矛盾。至少如果樣本輸出已完成。你想要所有可能的案例變化,包括'UnItEd StAtEs'?或者每行只有一個大寫字母? – Yunnosch

+0

只有小寫字母+空白保證輸入? – Yunnosch

+0

對新手來說寫得很好的問題;-) – GhostCat

回答

2

1)無

2)awk和SUBSTR()

3)你不會

開始與此:

$ echo 'foo' | 
awk '{ 
    for (i=1;i<=length($0);i++) { 
     print substr($0,1,i-1) toupper(substr($0,i,1)) substr($0,i+1) 
    } 
}' 
Foo 
fOo 
foO 

和按摩,以適應與顯而易見的邏輯。

+0

你能否詳細說明你的「1)否」? – Yunnosch

+1

sed用於簡單替換個別行,就這些。對於除s/old/new之外的任何其他內容,您都應該使用awk來簡化,清晰,健壯,高效,便攜以及軟件的所有其他所需屬性。你的要求不能通過簡單的s/old/new /來滿足,所以sed不適合這份工作。除了s,g和p(帶-n)以外的所有sed構造僅用於心理練習,而不適用於生產軟件,因爲它們在20世紀70年代中期發明awk時變得過時了。 –

+1

這就是我,不是閱讀(或理解)你的答案。我刪除了我的評論。 – Yunnosch

1

爲了sed的樂趣。

1)是的。下面

sed -E "s/^.*$/\n&#\n/;:a;s/\n([^#\n]*)([^#\n])#([^#\n]*)\n/\n\1#\u\2\3\n\1#\l\2\3\n/;ta;s/(^\n#|\n$)//g;s/\n#/\n/g;" 

這(例如GNU sed的版本4.2.1)
2)有可能AWK,PERL
3)請參閱代碼並假設 「#」 不是文件中找到的字符串的一部分。

  • 創建特定圖案
    (開始和新行結束;標記光標#
  • 開始一個循環
    • 替換包含光標由同一文本兩次換行之間的文本,並
      光標前一次大寫,小寫一次
    • 移動光標一開始
    • l空中接力如果換成東西
  • 在啓動和結束,光標

注意#沒有特殊刪除換行符。它只是一個字符,不會出現在輸入中,也不會出現在所需的輸出中。希望你能找到一個特殊的角色。
如果你可以擁有所有的字符,它會變得複雜。看看這個答案的評論。可能正在進行一場討論。

輸出(輸入爲 「foo」):

FOO 
fOO 
FoO 
foO 
FOo 
fOo 
Foo 
foo 
+0

爲了學習,如果我確實擁有#作爲字符串的一部分? – user316114

+1

我對此表示尊重。 – Yunnosch

+0

@ user316114看起來像沒有簡單的通用解決方案,用於麻煩的字母。我假設我編輯回答的「使用其他未發生的信件」並不令人滿意。如果你創建一個問題,它可能會變得有趣,或者至少吸引指向答案的指針。 – Yunnosch