删除带有嵌套的空块

删除带有嵌套的空块

我想删除表单的空配置块(也可以嵌套)

输入文件:

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:]]模式匹配空格和换行符(以及其他一些类似空格的字符)。

该模式[[:alnum:][:space:]]*[[:space:]]*{[[:space:]]*}将匹配您的部分之一word { ... },其中 为{ ... }空或仅包含空格字符(空格、制表符、换行符等),并且word可能是单个单词或由空格分隔的多个单词。它还会匹配“匿名”空部分,例如{ }word前面没有标签)。

空部分在循环中被删除(again代码中的标签)。t如果最近的s命令至少进行了一次替换,则该命令将分支到给定的标签。如果确实如此,现在可能还有更多的空部分需要删除,从而形成循环。

对于数据如

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

该循环将运行该s命令五次(最终删除所有内容)。


你的sed脚本:

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

或者,以长形式,

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

永远无法删除包含空部分的部分,如a { b { } }.另外,它似乎忽略了节标签和节可能看起来像的可能性a { b { } abc c { d { } } }(如果它被分成两行,而不是转换成 ,它将被完全删除a { abc })。

另外,我不确定什么\s是匹配的,但它似乎[[:space:]]与 GNU匹配sed。标准sed要求换行符或;在命令末尾,因此脚本必须d;}在末尾(在单行版本中)。

相关内容