Удалить недействительные доменные имена с помощью Sed

Удалить недействительные доменные имена с помощью Sed

У меня возникли проблемы с написанием команды 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, что нужно вывести строки, соответствующие регулярному выражению.

Изменения в регулярном выражении

Обратите внимание, что ^*это недопустимый способ начать регулярное выражение. ^соответствует началу строки и *будет соответствовать нулю или более предшествующих символов, но предшествующий символ не указан. Это можно сделать допустимым, добавив точку, как в ^.*. Это соответствует строке, которая начинается с чего угодно. Но поскольку это здесь бесполезно, я удалил это.

Кроме того, поскольку вы, судя по всему, хотели исключить строки, заканчивающиеся точкой, я изменил \.[a-zA-Z]{2,15}?$на ([.][a-zA-Z]{2,15})?$.

О попытках других людей создать регулярное выражение для сопоставления доменных имен см., например, здесь:Проверка доменного имени с помощью RegExилирегулярное выражение соответствует основному доменному имени.

Связанный контент