echo '60 test' | sed -r 's/(.*)\s+[^\s]+$/\1/'结果:
60试验
最后一列没有被剪掉。但它很适用于
echo '60 home' | sed -r 's/(.*)\s+[^\s]+$/\1/'结果:
60
为什么?
发布于 2019-06-17 04:20:58
[^\s]+意味着not backslash or s repeated 1 or more times和test包含s,而home不包含,因此home与regexp匹配,而前者不匹配。
您应该使用它们中的任何一种来匹配非空间:
$ 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,而-E是GNU或OSX/BSD,所以通常使用它是更好的选择,但是OSX/BSD不会识别\s或\S,所以从-r到-E实际上并不能使脚本在这种情况下更易于移植,您必须使用以下方法:
sed -E 's/[[:space:]]+[^[:space:]]+//'然后将其完全移植到所有POSIX seds中:
sed 's/[[:space:]]\{1,\}[^[:space:]]\{1,\}//'或者,如果总是有两个或更多的字段,这将是相同的:
sed 's/[[:space:]]*[^[:space:]]*//'发布于 2019-06-17 02:47:18
如果您只是在空格之前打印字符串的第一部分,而不进行任何其他修改,则只需使用cut即可。
echo '60 test' | cut -d' ' -f1
60定义分隔符(-d)和要选择的字段(-f)的位置。不需要使用sed进行复杂的解决方案并执行一些替换操作。
使用awk,您还可以打印第一个字段:
echo '60 test' | awk '{print $1}'
60或通过perl模式下的grep将\s考虑在内。
echo '60 test' | grep -oP '^.*?(?=\s)'
60https://stackoverflow.com/questions/56623465
复制相似问题