2016-06-30 112 views
-2

我:如何從腳本中的字符串中刪除非字母?

something='sl89wS Gjf-_32b' 

我要回:

slwsgjfb 

我怎樣才能使它只返回字母,然後讓一切小寫?

+0

您忘記發佈您的代碼。 StackOverflow是關於幫助人們修復他們的代碼。這不是免費的編碼服務。任何代碼都比沒有代碼更好。祝你好運。 – shellter

回答

3

可以使用參數擴展:

${something//[^[:alpha:]]/} 

這裏所有的非字母字符變量something的([^[:alpha:]])將由無即替換將被省略。

例子:

$ str='sl89wS Gjf-_32b' 
$ echo "${str//[^[:alpha:]]/}" 
slwSGjfb 
1

的基本想法是,以取代所有不信:

[^a-Z] 

通過什麼:

$ s='sl8zZ9wS Gjf-_32b' 
$ echo "${s//[^a-Z]}" 
slzZwSGjfb 

,對於一個作品LC_ALL=en_US.UTF-8

$ s='sl8zZ9wS Gjf-_3éëì2b' 
$ echo "${s//[^a-Z]}" 
slzZwSGjféëìb 

或整理順序變化:

$ LC_COLLATE=C 
$ echo "${s//[^a-z]}" 
slzwjfb      ### Missing upper chars. 

在這些情況下,更可靠的列表。然而,如果所使用的字符包括重音字形(假定重音的字形不期望的),該想法失敗需要字符:

$ s='sl8zZ9wS Gjf-_3éëì2b' 
$ echo "${s//[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]}" 
slzZwSGjfb 

最終可靠命令行應該是:

$ s="$(LC_ALL=C eval printf '%s' "${s//[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]}")" 

或更短(如果該排序順序是ASCII字節值):

$ s="$(LC_ALL=C eval printf '%s' "${s//[^a-zA-Z]}")" 

以及將所述轉換到上字符:

當然
$ printf '%s\n' "${s^^}" 
SLZZWSGJFB 

所有bash下,。

+0

或''[^ a-zA-Z]'以避免去除大寫字母。 (或者在刪除字符之前使用你的'$ {s ^^}',但是如果需要的話,這會損失保存的情況) –

+0

@ DavidC.Rankin'[^ a-zA_Z]'只有在排序順序是'ASCII字節值',通常不是。假設你的意思是:回答編輯。 –

+0

好點。一些老學生看不到其他的東西。 –

相關問題