首页 > 解决方案 > 通配符 sed 在同一行的其他文本中搜索/删除

问题描述

我正在尝试使用 sed 删除带有部分通配符的匹配字符串,而我在此站点上为答案所做的搜索似乎不适用,或者我无法将它们转换为我的情况。

下面是我需要删除的文本字符串:

www.foo.com.cp123.bar.com

它位于与同一行上的其他条目的文件中。包含我的条目的行始终以 serveralias: 开头,但是,如下所示:

serveralias: www.domain.com mail.domain.com www.foo.com.cp123.bar.com domain.com

我可以通过“cp123.bar.com”文本确定我需要删除的内容,因为它始终保持不变。改变的是前面的“www.foo.com”。它可以在该行中仅出现一次或多次,但始终以“cp123.bar.com”结尾。根据我的研究,我尝试了以下两个命令:

sed 's/\ .*cp123.bar.com\ //g' file.txt

sed 's/\ [^:]+$cp123.bar.com\ //g' file.txt

我使用每个条目之间的空格作为查找/替换(删除)的起点和终点,但这是一个创可贴,并不总是有效,因为我需要删除的条目偶尔会在末尾行(后面没有空格)。但是,如果我不包含空格,那么所有内容都会被删除,因为我使用的是通配符,包括 www.domain.com、mail.domain.com 等我需要保留在那里的文本。运行上面的任何一个 sed 命令都不会做任何事情,只是打印文件中当前的内容。

关于我需要改变什么的任何想法?如果需要,我很乐意澄清任何事情。

标签: linuxsedcentos7

解决方案


Sed 需要一个-r标志才能使用增强的正则表达式。没有-r+将无法在正则表达式中工作。因此,一个

sed -r 's/ +[^ ]+\.cp123\.bar\.com//g'

会做你想做的。它删除以下子字符串:

  • 一个或多个空间
  • 后跟一个或多个非空格
  • 其次是.cp123.bar.com

推荐阅读