Sed只在没有分组的情况下工作

时间:2015-12-04 18:15:30

标签: regex bash sed

我有一个格式如下的文件:

foo: ...
bar: ...
baz: ...

我想删除所有以barbazgoo开头的行。我可以用以下格式做几个seds:

sed '/^bar:.*$/d'

但我想把所有可能性都放在一个。我认为这样可行,但不删除这些行:

sed '/^(?:bar|baz|goo):.*$/d'

我也注意到,即使这样也行不通:

sed '/^(bar):.*$/d'

这是令人惊讶的,因为我认为捕获组实际上不会改变模式匹配中的任何行为。

2 个答案:

答案 0 :(得分:4)

您需要使用扩展正则表达式

async.series([
  function(callback) {
    setTimeout(function() {
      console.log(“Task 1”);
      callback(null, 1);
    }, 300);
  },
  function(callback) {
    setTimeout(function() {
      console.log(“Task 2”);
      callback(null, 2);
    }, 200);
  },
  function(callback) {
    setTimeout(function() {
      console.log(“Task 3”);
      callback(null, 3);
    }, 100);
  }
], function(error, results) {
  console.log(results);
});

并且sed不支持perl正则表达式,所以你应该使用

sed -r '/^(bar):.*$/d'

没有非捕获组sed -r '/^(bar|baz|foo):.*$/d'

答案 1 :(得分:4)

您可以使用:

sed '/^\(bar\|baz\|foo\):/d' file

或者使用扩展的正则表达式:

sed -r '/^(bar|baz|foo):/d' file