私が持っている:スクリプト内の文字列から非文字を削除するにはどうすればよいですか?
something='sl89wS Gjf-_32b'
私は返すようにしたい:
slwsgjfb
は、どのように私はそれが唯一の文字を返し、その後、すべてが小文字にすることができますか?
私が持っている:スクリプト内の文字列から非文字を削除するにはどうすればよいですか?
something='sl89wS Gjf-_32b'
私は返すようにしたい:
slwsgjfb
は、どのように私はそれが唯一の文字を返し、その後、すべてが小文字にすることができますか?
あなたはパラメータ展開を使用することができます。
ここ${something//[^[:alpha:]]/}
変数something
のすべての非アルファベット文字([^[:alpha:]]
は)すなわち省略するなしに置き換えられます。
例:
$ str='sl89wS Gjf-_32b'
$ echo "${str//[^[:alpha:]]/}"
slwSGjfb
基本的な考え方は、文字ではありませんすべて置き換えることであろう:何によって
[^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の下で、もちろん。
または '[^ a-zA-Z]'を押して、大文字を削除しないようにします。 (またはあなたの '$ {s ^^}'をキャラクタの削除に先立って使用しますが、それが必要な場合は保存ケースを破ります) –
@ DavidC.Rankin '[^ a-zA_Z]'は照合順が'ASCIIバイト値'、一般的ではありません。それを意味すると仮定します:答えは編集されました。 –
良い点。いくつかの古い就業者はほとんど他人を見ない。 –
コードを投稿するのを忘れました。 StackOverflowは、人々がコードを修正する手助けをしています。無料のコーディングサービスではありません。どのコードもコードなしより優れています。がんばろう。 – shellter