入力を検証して文字セットを削除しようとしています。英数字、ピリオド、アンダースコア、ハイフンのみが許可されます。ここで正規表現[^\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 でスキップ/削除しましたが、何も削除されませんでした。
tr 's -c
(補数)フラグはオプションの場合があります
echo "Â10.41.89.50-._ " | tr -cd '[:alnum:]._-'
代わりに[: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
の回答もご覧ください。
Well sedはUnicode文字をサポートしません。代わりにPerl
を使用します。
> s="Â10.41.89.50 "
> Perl -pe 's/[^\w.-]+//g' <<< "$s"
10.41.89.50
英数字と「-」以外のすべての文字を削除するには、次のコードを使用します。
echo "a b-1_2" | sed "s/[^[:alnum:]-]//g"
Anubhavaの答えに基づいて、これは私のために働いた:
s/^[[:alnum:]]//g
英数字以外を単一のスペースに置き換えました。
注意: "。"文字が保存されます
<`[[:alnum:]_.@]`
これは私にとってはうまくいきました。目的のために指定したすべての文字が保持されました。