Regex 带有可选固定字符串的正则表达式

Regex 带有可选固定字符串的正则表达式,regex,sed,Regex,Sed,我有一个字符串,有三个或四个用冒号分隔的术语。第二个术语可能以固定后缀结尾。我需要捕获前两个术语,不包括第一个捕获组中的后缀。 以下所有字符串都应给出a:b a:b:c a:b:c:d a:b-SUFFIX:c a:b-SUFFIX:c:d 以下表达式适用于包含3个术语但不包含4个术语的情况 (.*:.*?)(-SUFFIX.*|:.*) 一次编辑是否可行?那么: (.*?:.*?)(-SUFFIX.*|:.*) 试试这个: $ sed -r 's/([^:]*:[^:]*):.*/\1/

我有一个字符串,有三个或四个用冒号分隔的术语。第二个术语可能以固定后缀结尾。我需要捕获前两个术语,不包括第一个捕获组中的后缀。 以下所有字符串都应给出
a:b

a:b:c
a:b:c:d
a:b-SUFFIX:c
a:b-SUFFIX:c:d
以下表达式适用于包含3个术语但不包含4个术语的情况

(.*:.*?)(-SUFFIX.*|:.*)
一次编辑是否可行?

那么:

(.*?:.*?)(-SUFFIX.*|:.*)
试试这个:

$ sed -r 's/([^:]*:[^:]*):.*/\1/; s/-SUFFIX$//' file
a:b
a:b
a:b
a:b
工作原理
  • -r

    这需要扩展正则表达式语法

  • s/([^::]*:[^:]*):.*/\1/

    这只保留前两个字段

  • s/-后缀$/

    如果第二个字段有后缀,请将其删除

MacOSX 在OSX或其他BSD系统上,请尝试:

sed -E -e 's/([^:]*:[^:]*):.*/\1/' -e 's/-SUFFIX$//' file

发布您的预期输出。我相信我提到过它必须只通过一个编辑步骤来完成。不,您问它是否只通过一个编辑就可以完成,您没有说明必须这样做,也没有解释“编辑步骤”的含义。大多数版本的
sed
缺乏执行非贪婪正则表达式的能力。如果这个解决方案适合您,那么您使用的是哪个版本的
sed
?Marvin说(.*:.*.-(-SUFFIX.*.*.:*)可以使用3个术语,所以我认为另一个“?”会有所帮助。sed是否接受一个“?”并在第二个上失败。也许sed不是常用的工具?