2016-06-30 25 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

良い点。いくつかの古い就業者はほとんど他人を見ない。 –

関連する問題