この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以降のすべてのコマンドが実行されないことを意味します。
~からここ