Shell:删除文件中与正则表达式匹配的每一秒

Shell: delete every second match against a regex in a file

假设我想出了一个匹配一段数据的正则表达式;正则表达式包含 2 个 sed 组(包含在 () 中的子表达式)。还要说这个正则表达式被复制了 9 次以匹配整行。我面临的问题是如何删除(以一种优雅的方式)与正则表达式的每一秒匹配。

假设您有以下字符串并希望删除出现的 bar:

foo bar foo bar foo bar

您可以使用下面的 sed 命令,注意选项 g 可以使替换发生尽可能多的次数:

sed -r 's/([a-z]+) ([a-z]+)//g' <<< 'foo bar foo bar foo bar'

输出:foo foo foo.

然而,这不适用于单词数不是偶数的字符串。我会使用 * 量词使第二个捕获组可选,以使上述命令甚至可以使用这样的字符串:

sed -r 's/([a-z]+) ([a-z]+)*//g' <<< 'foo bar foo bar foo bar foo'

输出:foo foo foo foo.