[sed] dコマンドは「パターンスペース削除」ではなく「パターンスペース削除後に次のサイクルを開始する」


要点

sedのdコマンドについて「パターンスペースの削除」と記憶していたが、実は「パターンスペース削除後に次のサイクルを開始する」だった

解説

test.txt
1
2
3
4
5

上記ファイルがあるとき、

command
$ sed -n 'p; /3/d; s/^/-/p' test.txt

このコマンドの出力に以下を想定していた

expected_output
1
-1
2
-2
3
-
4
-4
5
-5

しかし、実際の出力は以下だった。

actual_output
1
-1
2
-2
3
4
-4
5
-5

理由としては/3/dにマッチした後、以降の処理s/^/-/pが実行されず次の行の処理を開始したため。

この「次のサイクルを開始する」の部分を知らずに、ループ処理の途中等でdコマンドを使うと、想定外の結果となってしまうので注意が必要。