为了清楚起见:我正在/ etc / passwd上测试我的代码 . 我试图用sed从文本中删除第二列(这是我老师的练习,这就是为什么我没有使用其他任何东西) . 我试过用
sed 's/\(.*\):\(.*\):\(.*\)/\2/' /etc/passwd
但它正在削减倒数第二列,可能是因为sed占据了所有字符,直到找到最后两个“:” . 如何在不指定文件中有多少的情况下剪切第二列?
如您所述, .* 可以匹配任意数量的字符,包括 : s .
.*
:
相比之下, [^:]* 匹配除 : 之外的所有内容,因此它不容易发生这种情况 .
[^:]*
正如Wiktor在评论中指出的那样:
sed -Ee 's/^([^:]*):([^:]*):.*/\2/' <<<'one:two:three:four'
...正确返回 two .
two
1 回答
如您所述,
.*
可以匹配任意数量的字符,包括:
s .相比之下,
[^:]*
匹配除:
之外的所有内容,因此它不容易发生这种情况 .正如Wiktor在评论中指出的那样:
...正确返回
two
.