sed + 删除“点字符串”之前不包含字符串的所有单词

sed + 删除“点字符串”之前不包含字符串的所有单词

我阉割了以下 sed 语法,以便从文件中删除任何不包含 linux/LINUX 的主机

 sed -i '/linux\|LINUX/!d' file

例子

linux01.moon.com
solaris.moon.com
UNIX.foot.com

它会给

linux01.moon.com

但现在我们有其他情况,域还包括 linux 名称

linux01.room_linux.com
linux02.gt.com
linux03.klist.com
sol.linux.com

它会给

linux01.room_linux.com
linux02.gt.com
linux03.klist.com
sol.linux.com

代替

    linux01.room_linux.com
    linux02.gt.com
    linux03.klist.com

那么,如果包含 linux 或 LINUX,如何更改我的 sed 语法以忽略域名?

答案1

您需要将模式固定到行的开头^,然后只允许除点 ( [^.]*) 之外的其他字符,直到找到关键字:

sed -E '/^[^.]*(linux|LINUX)/!d'

请注意,您需要在替代模式周围添加大括号。我改用扩展正则表达式以使其更具可读性。

答案2

$ sed -e '
   h
   s/\..*//;y/linux/LINUX/;/LINUX/!d
   g
' inp.file

这是您可以采用的 Posix sed 方法。

相关内容