sed:!p 命令奇怪的行为

sed:!p 命令奇怪的行为

为什么以下命令会打印数值?

$ iostat | sed -n '/[:digit:]/!p'

       1.56    1.38    0.31    0.34    0.03   96.38

答案1

您尝试使用的 POSIX 字符类必须放置在正则括号表达式内,因此[[:digit:]]不能放置在[:digit:].您也不限于在方括号表达式中仅使用一种字符类,因此可以使用例如[[:digit:][:punct:]]或。[^[:digit:]]

您的命令实际上意味着“打印与任何字符:d、或不匹配的所有行:igt

$ printf 'a\nd\ni\n:\n'
a
d
i
:
$ printf 'a\nd\ni\n:\n' | sed -n '/[:digit:]/!p'
a

你想要的是:

$ 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

请注意,较新的 GNU sed 版本(本例中为 v.4.4)将打印警告:

$ iostat | sed -n '/[:digit:]/!p'
sed: character class syntax is [[:space:]], not [:space:]

相关内容