Я новичок 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