首先,我知道遵循这种格式的普通conf文件(我不知道它叫什么)通常有一个空行分隔各部分,这使得这个问题变得容易得多。但我想知道是否有一种小而干净的方法可以在 awk 中仅打印以下文件的第 2 部分(称为 test.conf):
[section1]
a = 1
b = 2
[section2]
c = 3
d = 4
[section3]
e = 5
d = 6
我的第一次猜测失败了:
bash-3.2$ awk '/^\[section2\]$/,/^\[/' test.conf
[section2]
因为同一行同时匹配开始和结束范围分隔符。我感觉有一种更好的方法可以做到这一点,而不是在进入第 2 部分时设置一些变量,然后在进入下一部分时将其关闭。有人知道吗?
最佳答案
AWK 解决方案
安INI file通常不保证其部分的顺序,因此以下内容有些脆弱,因为它依赖于顺序。但是,它非常短并且适用于您定义的语料库。
$ gawk '/section3/ {exit}; /section2/,/section3/ {print}' /tmp/foo.ini
[section2]
c=3
d=4
替代方案
使用 sed 删除行。简短且不依赖于顺序,但可能有点神秘。
$ sed -n '/section2/, /^\[/ { /section[^2]/d; p }' /tmp/foo.ini [section2] c=3 d=4
使用 Perl 的触发器运算符。极其灵活。
$ perl -ne 'push(@lines, $_) if /section2/.../section3/; END {pop @lines; print @lines}' /tmp/foo.ini [section2] c=3 d=4
关于awk - 打印配置文件的一部分的最小 awk 程序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19239052/