为什么以下命令打印数值?
$ iostat | sed -n '/[:digit:]/!p'
1.56 1.38 0.31 0.34 0.03 96.38
Run Code Online (Sandbox Code Playgroud)
ter*_*don 10
您尝试使用的 POSIX 字符类必须放在正则括号表达式中,因此[[:digit:]]不能放在[:digit:]. 您也不限于在括号表达式中仅使用一个字符类,因此例如[[:digit:][:punct:]]或[^[:digit:]]可以使用。
您的命令实际上意味着“打印所有与任何字符:, d, i,g或都不匹配的行t:
$ printf 'a\nd\ni\n:\n'
a
d
i
:
$ printf 'a\nd\ni\n:\n' | sed -n '/[:digit:]/!p'
a
Run Code Online (Sandbox Code Playgroud)
你想要的是:
$ iostat | sed -n '/[[:digit:]]/!p'
avg-cpu: %user %nice %system %iowait %steal %idle
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
Run Code Online (Sandbox Code Playgroud)
请注意,较新的 GNU sed 版本(本例中为 v.4.4)将打印警告:
$ iostat | sed -n '/[:digit:]/!p'
sed: character class syntax is [[:space:]], not [:space:]
Run Code Online (Sandbox Code Playgroud)