首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用sed裁剪最后一列的意外结果

使用sed裁剪最后一列的意外结果
EN

Stack Overflow用户
提问于 2019-06-17 00:01:11
回答 2查看 136关注 0票数 3
代码语言:javascript
运行
复制
echo '60 test' | sed -r 's/(.*)\s+[^\s]+$/\1/'

结果:

60试验

最后一列没有被剪掉。但它很适用于

代码语言:javascript
运行
复制
echo '60 home' | sed -r 's/(.*)\s+[^\s]+$/\1/'

结果:

60

为什么?

EN

回答 2

Stack Overflow用户

发布于 2019-06-17 04:20:58

[^\s]+意味着not backslash or s repeated 1 or more timestest包含s,而home不包含,因此home与regexp匹配,而前者不匹配。

您应该使用它们中的任何一种来匹配非空间:

代码语言:javascript
运行
复制
$ echo '60 test' | sed -r 's/(.*)\s+\S+$/\1/'
60

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

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

代码语言:javascript
运行
复制
sed -E 's/\s+\S+$//'

我从-r切换到了-E,因为-r只是GNU,而-E是GNU或OSX/BSD,所以通常使用它是更好的选择,但是OSX/BSD不会识别\s\S,所以从-r-E实际上并不能使脚本在这种情况下更易于移植,您必须使用以下方法:

代码语言:javascript
运行
复制
sed -E 's/[[:space:]]+[^[:space:]]+//'

然后将其完全移植到所有POSIX seds中:

代码语言:javascript
运行
复制
sed 's/[[:space:]]\{1,\}[^[:space:]]\{1,\}//'

或者,如果总是有两个或更多的字段,这将是相同的:

代码语言:javascript
运行
复制
sed 's/[[:space:]]*[^[:space:]]*//'
票数 5
EN

Stack Overflow用户

发布于 2019-06-17 02:47:18

如果您只是在空格之前打印字符串的第一部分,而不进行任何其他修改,则只需使用cut即可。

代码语言:javascript
运行
复制
echo '60 test' | cut -d' ' -f1
60

定义分隔符(-d)和要选择的字段(-f)的位置。不需要使用sed进行复杂的解决方案并执行一些替换操作。

使用awk,您还可以打印第一个字段:

代码语言:javascript
运行
复制
echo '60 test' | awk '{print $1}'
60

或通过perl模式下的grep\s考虑在内。

代码语言:javascript
运行
复制
echo '60 test' | grep -oP '^.*?(?=\s)'
60
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56623465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档