我想删除表单的空配置块(也可以嵌套)
输入文件:
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;}
在末尾(在单行版本中)。