1

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

0

Мне пришлось изменить ваше регулярное выражение, чтобы сделать его действительным, но эта команда 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}?$ to ([.] [a-zA-Z] {2,15})?$.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .