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
.
假设我想出了一个匹配一段数据的正则表达式;正则表达式包含 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
.