gpt4 book ai didi

regex - 用 sed 剪切最后一列的意外结果

转载 作者:IT王子 更新时间:2023-10-29 01:04:33 26 4
gpt4 key购买 nike

echo '60 test' | sed -r 's/(.*)\s+[^\s]+$/\1/'

结果:

60 test

最后一列没有被剪切。但它与

配合得很好
echo '60 home' | sed -r 's/(.*)\s+[^\s]+$/\1/'

结果:

60

为什么?

最佳答案

[^\s]+ 表示 不是反斜杠或 s 重复 1 次或多次 并且 test 包含 shome 不匹配,因此后者匹配正则表达式而前者不匹配。

您应该使用其中任何一个来匹配非空格:

$ echo '60 test' | sed -r 's/(.*)\s+\S+$/\1/'
60

$ echo '60 test' | sed -r 's/(.*)\s+[^[:space:]]+$/\1/'
60

正如@potong 在评论中所建议的那样,要使用 sed 删除最后一列,您真正需要的是:

sed -E 's/\s+\S+$//'

我从 -r 切换到 -E 因为 -r 是 GNU sed 而 -E 是GNU 或 OSX/BSD sed 所以使用它通常是更好的选择 BUT OSX/BSD sed 不会识别 \s\S 所以从 -r 改变-E 在这种情况下并不能真正使脚本更具可移植性,您必须改用它:

sed -E 's/[[:space:]]+[^[:space:]]+//'

然后要完全移植到所有 POSIX seds,它将是:

sed 's/[[:space:]]\{1,\}[^[:space:]]\{1,\}//'

或者如果总是有 2 个或更多字段,这将表现相同:

sed 's/[[:space:]]*[^[:space:]]*//'

关于regex - 用 sed 剪切最后一列的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56623465/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com