sed: Удалить все, начиная с точки после FQDN

sed: Удалить все, начиная с точки после FQDN

Я новичок sedи у меня возникли некоторые трудности с его реализацией.

Я хочу вот этого:

abc.ztx.com. A 132.123.12.44 ---> abc.ztx.com

Я использовал следующий шаблон, но он, похоже, не работает:

echo "abc.ztx.com. A 132.123.12.44" | sed 's/\.\s.+//g'

Я проверил регулярное выражение с помощью regex101.com и шаблона, полностью \.\s.+соответствует части . A 132.123.12.44. Почему это не работает с sed.

Ценю вашу помощь. Спасибо.

решение1

sedиспользует базовые регулярные выражения POSIX (BRE) по умолчанию. \s— это PCRE (Perl-совместимое регулярное выражение), которое эквивалентно BRE [[:blank:]](я думаю, сопоставляет пробелы и табуляции, или, возможно, [[:space:]]сопоставляет больший набор пробельных символов). +— это модификатор расширенного регулярного выражения POSIX (ERE), который эквивалентен \{1,\}BRE.

Поэтому постарайтесь

sed 's/\.[[:blank:]].*//'

Вместо этого вы можете заменить [[:blank:]]его пробелом, если вам не нужно сопоставлять табуляции:

sed 's/\. .*//'

Обратите внимание, что нет необходимости делать замену с флагом, gтак как всегда будет только одно совпадение. Кроме того, то, .+что вы используете, можно просто заменить на .*вместо, .\{1,\}так как нам все равно, есть ли вообще какие-либо дополнительные символы (просто удалите их все).

Связанный:

решение2

Если вы используете Gnu/Linux или любой другой Gnu, то у вас будет Gnu sed. Gnu sed имеет опцию -r, которая позволяет это сделать.

Добавьте возможность -rизменить диалект регулярных выражений.

например

echo "abc.ztx.com. A 132.123.12.44" | sed -r 's/\.\s.+//g'

решение3

Ваш вопрос конкретно касается sed, но я бы использовал cutдля этого.

Если вы можете жить с точкой в ​​конце, то:

$ echo "abc.ztx.com. A 132.123.12.44" | cut -d" " -f1

abc.ztx.com.

Если вам не нравится точка в конце, то:

$ echo "abc.ztx.com. A 132.123.12.44" | cut -d" " -f1 | rev | cut -d. -f2- | rev

abc.ztx.com

или:

$ echo "abc.ztx.com. A 132.123.12.44" | cut -d" " -f1 | sed -e "s/\.$//"

abc.ztx.com

решение4

Еще одна возможность использования awk, где .в качестве разделителя полей указана (точка + пробел):

echo "abc.ztx.com. A 132.123.12.44" | awk -F '\\. ' '{print $1}'

abc.ztx.com

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