ネストによる空のブロックの削除

ネストによる空のブロックの削除

フォームの空の構成ブロックを削除したい(ネスト可能)。

入力ファイル:

abc {
a
}
bcd {
    spq {
    }
}
ecd pqr {
}
xyz {
so
}

予想出力:

abc {
a
}
xyz {
so
}

私は試した:

sed '/{$/{N;/{\n\s}$/d}' SampleToDelete.txt

しかし、これは役に立ちません。新しい行とスペースを表現できません。

答え1

$ sed -n -f script.sed file
abc {
a
}
xyz {
so
}

script.sedどこ

1 {
    # 1st line, save it to the hold space
    # and skip to next line.
    h
    d
}

# Append all other lines to hold space
# with an embedded newline as delimiter.
H

$ {
    # Last line, swap in hold space
    # (which by now contains the whole document).
    x

    # Replace all empty "word { ... }" sections
    # until there are no more such sections.
    # "word" may be a single word or multiple words
    # separated by whitespace.

    :again
    s/[[:alnum:][:space:]]*[[:space:]]*{[[:space:]]*}//g
    t again

    # Squeeze multiple newlines into single newlines.
    s/\(\n\)\1*/\1/g

    # Output.
    p
}

この[[:space:]]パターンは、スペースや改行(および他のスペースに似た文字)と一致します。

パターンは、空白または空白文字(スペース、タブ、改行など)のみを含むセクションの1つと一致し、単一の単語またはスペースで区切られた複数の[[:alnum:][:space:]]*[[:space:]]*{[[:space:]]*}単語のいずれかです。また、「匿名」の空の部分とも一致します(たとえば、先行タグなし)。word { ... }{ ... }word{ }word

ループから空の部分が削除されます(againコードのラベル)。t最後のsコマンドが1つ以上の置換を実行した場合、コマンドは指定されたラベルに分岐します。その場合、削除する空のセクションが多くなり、ループが生成される可能性があります。

次のデータの場合

a { b { c { d { e { } } } } }

ループはsコマンドを5回実行します(最終的にすべてを削除します)。


あなたのsedスクリプト:

/{$/{N;/{\n\s}$/d}

または長い形式で、

/{$/ {
    N
    /{\n\s}$/d
}

空のセクションを含むセクションは、のように削除できませんa { b { } }。また、セクションラベルとセクションの外観の可能性を無視しているようですa { b { } abc c { d { } } }(変換されず、2行に分割されている場合は完全に削除されますa { abc })。 。

また、何が一致するのかよくわかりませんが、GNUと一致している\sようです。標準では、改行またはコマンドの最後に必要なので、スクリプトは最後になければなりません(1行バージョンの場合)。[[:space:]]sedsed;d;}

関連情報