
この 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 の後に続くコマンドは実行されないことを意味します。
からここ