空白类包含什么
空白类简写匹配空格、制表符、换行、回车、换页与垂直制表符等空白字符;取反的空白类匹配其余字符。它在 Unicode 语义下还会扩展到更多不可见字符,例如不换行空格与部分全角空格。
换行是最大变量
很多坑都出在「空白类包含换行」这一点上:用空白类加号切分字段,跨行文本会被合并;用取反空白类做整行内容提取,遇到行尾空行会提前结束。想只处理行内空白,必须显式写成空格与制表符的集合。
基本信息
| 包含字符 | 空格、制表符、换行符、回车符、换页符、垂直制表符 |
|---|---|
| Unicode 扩展 | 文本模式下还会匹配不换行空格等不可见字符,具体范围以引擎文档为准 |
| 取反写法 | 大写 S 表示非空白字符的任意一个 |
| 行内替代写法 | 显式写空格与制表符的集合,可避免吞掉换行 |
| 命令行等价 | 字符类空白写法与简便写法在不同工具里略有差异 |
| 性能提示 | 空白类加号配合非贪婪常用于跳过间隔,但连续空白过长时回退次数会上升 |
典型使用场景
- 切分以空白分隔的字段,例如命令输出与日志列
- 清洗用户输入的首尾空白与中间多余间隔
- 校验字段内不含空白,配合锚点做整体判断
- 匹配缩进,区分制表符与空格两种缩进风格
- 跨行处理时先明确是否需要把换行也当作空白
空白类的写法与差别
空白类的写法与差别
grep -E '^[[:space:]]+' f.txt # 行首必须有空白字符
grep -E '^[ \t]+' f.txt # 只把空格与制表符当缩进,不含换行
sed 's/[ \t]*$//' f.txt # 去掉行尾空白,不会跨行
tr -s ' ' < f.txt | head # 压缩连续空格,需要外部工具配合
awk 'NF{print $1}' f.txt # 按空白切列,天然逐行处理
cut -d' ' -f1 f.txt | head # 只用单个空格做分隔符,与空白类不同空白相关写法对照
| 写法 | 含义 | 是否含换行 |
|---|---|---|
| 空白类简写 | 所有空白字符 | 含 |
| 取反空白类 | 所有非空白字符 | 不含换行以外的空白 |
| 空格与制表符集合 | 只匹配这两种 | 不含 |
| 空格字面量 | 只匹配空格 | 不含 |
| 空白类加号 | 连续空白整体 | 含,会跨行合并 |
处理制表符分隔的数据时,先确认分隔符到底是制表符还是多个空格。空白类会同时吃掉两者,用它切出来的列在使用制表符对齐的数据上可能与肉眼所见不一致。
在 Unicode 语义下,某些看起来不是空白的不可见字符也会被算作空白,例如不换行空格。做严格校验时建议显式写明允许的空白字符集合,而不是依赖简写类。