删除文件中的多行

tra*_*gle 6 sed awk text-processing

通常我会在之前回答的问题中找到我的答案,但这次不是(或者我不理解答案并且无法修改它们来做我希望他们做的事情),所以我在这里问我的第一个问题。

我的输入文件看起来像

# -*- coding: utf-8 -*-

[attachment]

[browser]


[changeset]

[components]
tracopt.versioncontrol.svn.svn_fs.subversionconnector = enabled
tracopt.versioncontrol.svn.svn_prop.subversionmergepropertydiffrenderer = enabled 
tracopt.versioncontrol.svn.svn_prop.subversionmergepropertyrenderer = enabled
tracopt.versioncontrol.svn.svn_prop.subversionpropertyrenderer = enabled

[header_logo]

[inherit]
file = /etc/trac/trac.ini

[logging]
Run Code Online (Sandbox Code Playgroud)

我想删除所有空白部分,如附件、浏览器、变更集、header_logo 和日志记录。我只会保留非空的部分。输出文件应该看起来像

# -*- coding: utf-8 -*-

[components]
tracopt.versioncontrol.svn.svn_fs.subversionconnector = enabled
tracopt.versioncontrol.svn.svn_prop.subversionmergepropertydiffrenderer = enabled
tracopt.versioncontrol.svn.svn_prop.subversionmergepropertyrenderer = enabled
tracopt.versioncontrol.svn.svn_prop.subversionpropertyrenderer = enabled

[inherit]
file = /etc/trac/trac.ini
Run Code Online (Sandbox Code Playgroud)

这应该发生在 bash 脚本中。我想过使用 sed :寻找正则表达式,\[.+\]\n(\n)+(?=\[)但这似乎不适用于 sed 因为我应该提前知道正则表达式将有多少行并相应地使用N。正则表达式也应该使用 EOF 而不是最终的\[,但是如果我找到为\[.

知道我怎么能做到这一点吗?有没有比 sed 更好的方法?

meu*_*euh 8

它有点乱,sed但可能:

sed -n '
:start
/^\[/{
    h
  :loop
    n
    /^\[/b start
    /^$/b loop
    x;p;g
}
p'
Run Code Online (Sandbox Code Playgroud)

-n表示默认不打印任何内容。:start只是稍后转到的标签。我们匹配开始[和开始一组 ({...}) 命令的行。我们将该行复制到保留空间 (h)。我们得到下一行(n)。如果它开始,[我们有一个空部分,所以再次转到 (b) 开始。

如果该行为空 (/^$/),我们将读取另一行(goto 循环)。该行不为空,因此我们将行与保留的节标题(x)交换,打印节标题(p),返回当前行(g)并继续退出命令组以打印(p)该行. 最后一个 (p) 还打印非节标题。