echo '60 test' | sed -r 's/(.*)\s+[^\s]+$/\1/'
Run Code Online (Sandbox Code Playgroud)
结果:
60测试
最后一列不删减。但它与
echo '60 home' | sed -r 's/(.*)\s+[^\s]+$/\1/'
Run Code Online (Sandbox Code Playgroud)
结果:
60
为什么?
[^\s]+表示not backslash or s repeated 1 or more times并test包含swhile home不会,因此后者匹配regexp而前者则不匹配。
您应该使用以下任一方法来匹配非空格:
$ echo '60 test' | sed -r 's/(.*)\s+\S+$/\1/'
60
$ echo '60 test' | sed -r 's/(.*)\s+[^[:space:]]+$/\1/'
60
Run Code Online (Sandbox Code Playgroud)
正如@potong在评论中建议的那样,要删除带有sed的最后一列,您真正需要的是:
sed -E 's/\s+\S+$//'
Run Code Online (Sandbox Code Playgroud)
我从切换-r到-E的-r是GNU的sed只有当-E是GNU或OSX / BSD的sed所以它通常是更好的选择使用,但OSX / BSD的sed将无法识别\s或\S因此从改变-r到-E没有真正的脚本对此更便携情况下,您必须改用以下方法:
sed -E 's/[[:space:]]+[^[:space:]]+//'
Run Code Online (Sandbox Code Playgroud)
然后要完全移植到所有POSIX sed中,它将是:
sed 's/[[:space:]]\{1,\}[^[:space:]]\{1,\}//'
Run Code Online (Sandbox Code Playgroud)
否则,如果总是有2个或更多字段,则其行为相同:
sed 's/[[:space:]]*[^[:space:]]*//'
Run Code Online (Sandbox Code Playgroud)