次のような sed コマンドを書くのに問題があります。有効なドメイン名のみを含むファイルがあります。sed を使用して、式に一致しない行を削除するにはどうすればよいでしょうか。
以下は、私が使用したオンライン ツールに保持したい行と一致しているようですが、もっとうまく記述できると思います。
^*.*[a-zA-Z0-9][a-zA-Z0-9-]+\.[a-zA-Z]{2,15}?$
ファイル
example.example.example.org
01.001.11.00.example.com
asdf-asdf-asdf-www.example.net
example
example.example.co.uk
(example)
example.photography
example.info
example/
example.
example</h1>
{example}
etc.
期待される出力:
example.example.example.org
01.001.11.00.example.com
asdf-asdf-asdf-www.example.net
example.example.co.uk
example.photography
example.info
助けてくれてありがとう。
答え1
正規表現を有効にするには修正する必要がありましたが、この sed コマンドは一致する行のみを出力します。
$ sed -nr '/[.].*[a-zA-Z0-9][a-zA-Z0-9-]+([.][a-zA-Z]{2,15})?$/p' file
example.example.example.org
01.001.11.00.example.com
asdf-asdf-asdf-www.example.net
example.example.co.uk
example.photography
example.info
使い方
-n
これは、明示的に要求しない限り、 sed に行を印刷しないように指示します。
-r
これは、sed に拡張正規表現を使用するように指示します。
/[.].*[a-zA-Z0-9][a-zA-Z0-9-]+([.][a-zA-Z]{2,15})?$/p
/.../
正規表現に一致する行を選択し、/.../p
sed に正規表現に一致する行を出力するように指示します。
正規表現の変更
^*
は正規表現を開始する有効な方法ではない ことに注意してください。^
は行の先頭に一致し、*
は先行する文字の 0 個以上と一致しますが、先行する文字が指定されていません。 のようにピリオドを追加することで、これを有効にできます^.*
。これは、任意の文字で始まる行に一致します。しかし、ここでは役に立たないので、削除しました。
また、ピリオドで終わる行を除外したいようなので、\.[a-zA-Z]{2,15}?$
に変更しました([.][a-zA-Z]{2,15})?$
。
ドメイン名に一致する正規表現を作成する他の人の試みについては、たとえば、以下を参照してください。正規表現によるドメイン名の検証または正規表現のメインドメイン名との一致。