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:]。また、角かっこ式には1つの文字クラスのみを使用するように制限されていないため、またはを使用できます[[: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:]

関連情報