2番目の例では、最初の空白の後に、論理的には最初の数字の前に表示されるすべての非数字を削除したいようです。文字だけでなく、ダッシュ、アンダースコア、さらにはドットを削除するために必要です。数字ではないものは何でも。それは示唆しています:
sed -e 's/ [^0-9]*/ /'
これはかなり最小限ですが、基準を満たしています。
$ cat data
host_192.168.0.100 host_192.168.0.100
ab-ab-abababab-ABABABAB-000.000.000.0 ab-ab-abababab-ABABABAB-000.000.000.0
$ sed -e 's/ [^0-9]*/ /' data
host_192.168.0.100 192.168.0.100
ab-ab-abababab-ABABABAB-000.000.000.0 000.000.000.0
$
優れた正規表現を作成するスキルの大部分は、正規表現に実際に実行させたいことの適切な説明を作成することです(正規表現にとって意味のある用語で)。
先頭の数字と文字、および末尾の素材を含む3つの新しいアイテムは、生活をかなり複雑にします。
$ cat data
host_192.168.0.100 host_192.168.0.100
ab-ab-abababab-ABABABAB-000.000.000.0 ab-ab-abababab-ABABABAB-000.000.000.0
01-admin-10.10.10.10 01-admin-10.10.10.10
10.10.10.10-NAT 10.10.10.10-NAT
1test-10.10.10.10 1test-10.10.10.10
$ sed -e 's/ [^0-9]*/ /' \
> -e 's/ [^.]*-\([0-9][0-9.]*[0-9]\)/ \1/' \
> -e 's/ \([0-9][0-9.]*[0-9]\)[^0-9.].*$/ \1/' data
host_192.168.0.100 192.168.0.100
ab-ab-abababab-ABABABAB-000.000.000.0 000.000.000.0
01-admin-10.10.10.10 10.10.10.10
10.10.10.10-NAT 10.10.10.10
1test-10.10.10.10 10.10.10.10
$
スクリプトは、3つのsed
独立したクリーニング式を取得します。1つ目は、前と同じように、スペースの直後の数字以外の数字を削除します。微調整が必要になる可能性はほとんどありません。
しかし、その01-admin-
線はそれによって影響を受けません。2番目の正規表現は、空白、ドット以外のシーケンスの後にダッシュが続くものを探し、数字で始まり、数字とドットが交互に配置され、数字で終わるシーケンスをキャプチャして、次のように置き換えることで処理します。記憶されている数字とドットの文字列。ダッシュを一致させることは、それが正常に機能するための鍵です。注意しないと、*
貪欲すぎます(たとえば、s/ .*\([0-9][0-9.]*[0-9]\)/\1/
IPアドレスコンポーネントの先頭の数字をむさぼり食うなど)。私はそれsed
が次のような貪欲でない量指定子を持っていないと仮定しています*?
; あなたのバージョンがそうするなら、あなたは異なる答えを思い付くかもしれません(しかし、このバージョンも同様に機能します)。他の例外的なケースを処理するには、そのパターンを微調整する必要があるかもしれません。この質問の編集としてではなく、自分でそれを行ってください。
3番目の正規表現は、末尾-NET
およびその他のそのような素材を扱います。数字とドットのシーケンス(数字で始まり、数字で終わる)を探して記憶し、その後に数字以外のドット以外の文字とその他の末尾の文字が続き、記憶されている数字とドットの文字列に置き換えます。これは、多くの調整を必要としない可能性があります。