如何用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
.
明确一点:我正在 /etc/passwd 上测试我的代码。 我正在尝试使用 sed 从文本中删除第二列(这是我老师的练习,这就是我不使用其他任何东西的原因)。 我尝试使用
sed 's/\(.*\):\(.*\):\(.*\)//' /etc/passwd
但它正在截取倒数第二列,可能是因为 sed 正在获取所有字符,直到找到最后两个“:”。如何在不指定文件中有多少列的情况下剪切第二列?
如您所见,.*
可以匹配任意数量的字符,包括 :
s。
[^:]*
匹配 除了 和 :
之外的所有内容,所以它不容易出现这种情况。
正如 Wiktor 在评论中指出的那样:
sed -Ee 's/^([^:]*):([^:]*):.*//' <<<'one:two:three:four'
...正确 returns two
.