web-dev-qa-db-ja.com

sedを使用した英数字以外の文字の削除

入力を検証して文字セットを削除しようとしています。英数字、ピリオド、アンダースコア、ハイフンのみが許可されます。ここで正規表現[^\w.-]をテストしました http://gskinner.com/RegExr/ そして削除したいものと一致するので、 sedが逆を返す理由がわからない。私は何が欠けていますか?

私の最終目標は、"Â10.41.89.50 "を入力し、"10.41.89.50 "を取得することです。

私はもう試した:

echo "Â10.41.89.50 " | sed s/[^\w.-]//gÂ...を返します

echo "Â10.41.89.50 " | sed s/[\w.-]//gおよびecho "Â10.41.89.50 " | sed s/[\w^.-]//gÂ10418950を返します

ここで見つかった答えを試みました 非ASCII文字をsed でスキップ/削除しましたが、何も削除されませんでした。

32
gorideyourbike

tr 's -c(補数)フラグはオプションの場合があります

echo "Â10.41.89.50-._ " | tr -cd '[:alnum:]._-'
46
iruvar

代わりに[:alpha:]クラスを使用することもできます。

echo "Â10.41.89.50 " | sed "s/[[:alpha:].-]//g"

動作するはずです。そうでない場合は、ローカル設定を変更する必要がある場合があります。

一方、数字、ハイフン、およびピリオドのみを保持する場合::

echo "Â10.41.89.50 " | sed "s/[^[:digit:].-]//g"

文字列が変数内にある場合、そのために純粋なbashと parameter expansions を使用できます。

$ dirty="Â10.41.89.50 "
$ clean=${dirty//[^[:digit:].-]/}
$ echo "$clean"
10.41.89.50

または

$ dirty="Â10.41.89.50 "
$ clean=${dirty//[[:alpha:]]/}
$ echo "$clean"
10.41.89.50

1_CRの回答もご覧ください。

13
gniourf_gniourf

Well sedはUnicode文字をサポートしません。代わりにPerlを使用します。

> s="Â10.41.89.50 "
> Perl -pe 's/[^\w.-]+//g' <<< "$s"
10.41.89.50
5
anubhava

英数字と「-」以外のすべての文字を削除するには、次のコードを使用します。

echo "a b-1_2" | sed "s/[^[:alnum:]-]//g"
0
panticz

Anubhavaの答えに基づいて、これは私のために働いた:

s/^[[:alnum:]]//g

英数字以外を単一のスペースに置き換えました。

注意: "。"文字が保存されます

0
Iwan Plays
<`[[:alnum:]_.@]`

これは私にとってはうまくいきました。目的のために指定したすべての文字が保持されました。

0
technerdius