sed: !p 命令奇怪的行为

sci*_*ci9 3 sed numeric-data

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

$ 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)