首页 > 解决方案 > 匹配 sed 中 [[:blank:]] 字符类的对面

问题描述

我找不到一种方法来表示 sed 中字符类的逆。如果这是一个类似 perl 的环境,我会使用 [^\s]。但是在 sed 中,这似乎匹配非 s,而不是非空白。

在一行文本(来自 gdrive)上,我需要捕获第一个非空白标记并忽略该行第一个空白之后(包括)之后的所有内容。

这是我要解析的输入的一个虚假但具有代表性的示例:

19845fake-FaKeE-xbk534sWsbBQ              mydir                                    dir               2019-01-01 19:10:44

我最初的尝试是这样的:

sed -rn 's/^([^\s]*).*$/\1/p'

起初它似乎有效,直到我注意到这是在第一个's'而不是第一个空格处切断。

从那以后,我尝试了各种排列,例如:

#matches up to the first 's'
 sed -rn 's/([^\\s]*).*$/\1/p'

#matches only the first character
 sed -rn 's/^([^[[:blank:]]]*).*$/\1/p'

#matches nothing at all
 sed -rn 's/^([[^:blank:]]*).*$/\1/p'



sed -rn 's/^\s*([^\s]*).*$/\1/p'

预期:19845fake-FaKeE-xbk534sWsbBQ

实际:19845fake-FaKeE-xbk534

标签: regexsedcharacter-class

解决方案


字符类是[:blank:]如此匹配它的反面,你只需要[^[:blank:]]. 这应该有效:

sed -rn 's/^([^[:blank:]]*).*$/\1/p' 

推荐阅读