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