sed - 简单的正则表达式替换不替换

sed - 简单的正则表达式替换不替换

我试图使用 sed 从主机名列表中删除任何子域前缀,但当我使用正则表达式时,它不会替换任何内容。这是不起作用的简化示例:

echo "subdomainxyz.example.com" | sed 's/[a-z]+\.example\.com//'

当我在那里硬编码特定的子域时,它工作得很好:

echo "subdomainxyz.example.com" | sed 's/subdomainxyz\.example.com/example.com/'

答案1

在提交问题之前我就找到了答案,但由于我已经输入了它,所以我想我会发布它,以防它对任何人有帮助。

需要的关键是添加-r标志(可能-E在某些版本上)来告诉sed支持扩展正则表达式,这是使用字符类/范围语法和加号运算符所需的[a-z]+。这就像你必须做的那样grep(出于某种原因,我认为sed默认为扩展正则表达式,但这是不正确的)。

这是一个工作示例:

echo "subdomainxyz.example.com" | sed -r 's/[a-z]+\.example\.com/example.com/'

编辑(信用steeldriver):

只需转义加号即可,不需要 -r 。例子:

echo "subdomainxyz.example.com" | sed 's/[a-z]\+\.example\.com/example.com/'

相关内容