通过用sed剪切最后一列获得意外结果

new*_*wID 3 regex linux sed

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

为什么?

Ed *_*ton 6

[^\s]+表示not backslash or s repeated 1 or more timestest包含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)

  • 也许`sed -E's / \ s + \ S + $ //'文件足以删除最后一列? (3认同)