如何用sed模仿"cut -d: -f2"? (“(。*):(。*):”匹配太多字段)

How to imitate "cut -d: -f2" with sed? ("(.*):(.*):" matching too many fields)

明确一点:我正在 /etc/passwd 上测试我的代码。 我正在尝试使用 sed 从文本中删除第二列(这是我老师的练习,这就是我不使用其他任何东西的原因)。 我尝试使用

sed 's/\(.*\):\(.*\):\(.*\)//' /etc/passwd

但它正在截取倒数第二列,可能是因为 sed 正在获取所有字符,直到找到最后两个“:”。如何在不指定文件中有多少列的情况下剪切第二列?

如您所见,.* 可以匹配任意数量的字符,包括 :s。

相比之下,

[^:]* 匹配 除了 : 之外的所有内容,所以它不容易出现这种情况。

正如 Wiktor 在评论中指出的那样:

sed -Ee 's/^([^:]*):([^:]*):.*//' <<<'one:two:three:four'

...正确 returns two.