You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选test.txt中竖线前含空白字符的行?sed/awk尝试未果

解决特殊空白字符导致的筛选问题

先搞懂M-标记是什么

cat -v输出里的M-前缀表示高ASCII字符(字节最高位为1,对应ASCII值128-255),这类字符属于非标准空白(比如全角空格、不间断空格、扩展ASCII空白等),普通正则的\s或空格匹配规则无法识别它们,这就是你用sed/awk没成功的原因。

验证特殊空白的具体编码

先确定该空白字符的字节值,方便精准处理:

od -t x1 test.txt
# 或者用hexdump
hexdump -C test.txt

常见特殊空白的编码参考:

  • 不间断空格(U+00A0)的UTF-8编码是c2 a0
  • 全角空格(U+3000)的UTF-8编码是e3 80 80
  • 扩展ASCII里的空白可能是a0(ISO-8859-1编码)

解决方案

方案1:用POSIX空白字符类匹配所有空白

POSIX的[[:space:]]会匹配所有空白类字符(包括标准空格、制表符、各类特殊空白),兼容性最好:

awk命令

# 匹配竖线前任意位置存在空白的行
awk '/.*[[:space:]]+.*\|/' test.txt

sed命令(GNU/BSD通用)

sed -n '/[[:space:]]\+|/p' test.txt

如果是BSD sed(比如macOS自带),可以把\+换成*(匹配0或多个空白):

sed -n '/[[:space:]]*|/p' test.txt

方案2:精准匹配特定特殊空白

如果已经知道空白的字节码,直接匹配:
比如匹配不间断空格(UTF-8编码c2 a0):

awk '/\xc2\xa0+\|/' test.txt

匹配全角空格:

awk '/\xe3\x80\x80+\|/' test.txt

方案3:先统一替换特殊空白为普通空格

先把所有空白类字符换成标准空格,再按常规规则筛选:

sed 's/[[:space:]]/ /g' test.txt | sed -n '/ +|/p'

或者用awk:

{gsub(/[[:space:]]/, " ")} / +\|/ {print} test.txt

内容的提问来源于stack exchange,提问作者Christopher Karsten

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 12:50:05