sed が空行を削除しないのはなぜですか?

sed が空行を削除しないのはなぜですか?

この sed コマンドはなぜ空行を削除しないのでしょうか?

sed -e 's/\r//g' -e '/^{$/d' -e '/^}$/d' -e ':begin;$!N;/^state-text: {[[:space:]]\n/s/\n//;tbegin;P;D' -e "s/'/''/g" -e '/^$/d' <<< $myvar

このコマンドは、最後の部分 -e '/^$/d' を除いてすべて正常に動作しますが、これは何も実行していないように見えます。以下は私のコンテンツのサンプルです。

begin dump

Ctrl_ID:100

これはcat -Aで表示されるものと同じコンテンツです

begin dump$
$
Ctrl_ID:100$

16進エディタで空行を調べると、16進値を持つ1つの文字だけが含まれていることがわかります。

0A

これは各行の末尾のコードとまったく同じです。

ここで何が起こっているのか分かりません。

^$一致するはずですよね?

答え1

これを試してください(空行の削除が最初の位置にあります):

sed -e '/^$/d' -e 's/\r//g' -e '/^{$/d' -e '/^}$/d' -e ':begin;$!N;/^state-text: {[[:space:]]\n/s/\n//;tbegin;P;D' -e "s/'/''/g" <<< $myvar

空行削除が機能しない原因となっている部分は次のとおりです。

-e ':begin;$!N;/^state-text: {[[:space:]]\n/s/\n//;tbegin;P;D'

さらに深く…

D は、パターン スペースの内容を最初の改行まで (改行がない場合は最後まで) 削除し、新しいサイクルを開始します。後者は、D 自体が実行されると、sed プログラム内の D の後に続くコマンドは実行されないことを意味します。

からここ

関連情報