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 更好的方法?
它有点乱,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) 还打印非节标题。