打印配置文件部分的最小的awk程序是什么?

Art*_*o E 3 awk

首先,我知道遵循这种格式的普通conf文件(我不知道它的名字)通常用空行分隔各节,这使此问题变得容易得多。但是我想知道是否有一种小巧的方法可以仅在awk中打​​印以下文件的section2(称为test.conf):

[section1]    
a = 1         
b = 2         
[section2]    
c = 3         
d = 4         
[section3]    
e = 5         
d = 6
Run Code Online (Sandbox Code Playgroud)

我的第一个猜测失败了:

bash-3.2$ awk '/^\[section2\]$/,/^\[/' test.conf
[section2]
Run Code Online (Sandbox Code Playgroud)

因为同一行同时匹配开始和结束范围定界符。我有一种更好的方法,那就是在进入section2时设置一些变量,然后在进入下一部分时将其关闭。有人知道吗

Tod*_*obs 5

AWK解决方案

一个INI文件通常不保证其节的顺序,所以下面是有些脆弱,因为它的顺序相关。但是,它非常短,可以与您定义的语料库一起使用。

$ gawk '/section3/ {exit}; /section2/,/section3/ {print}' /tmp/foo.ini
[section2]
c=3
d=4
Run Code Online (Sandbox Code Playgroud)

备择方案

  • 使用sed删除行。简短,与顺序无关,但可能有点神秘。

    $ sed -n '/section2/, /^\[/ { /section[^2]/d; p }' /tmp/foo.ini
    [section2]
    c=3
    d=4
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用Perl的触发器运算符。非常灵活。

    $ perl -ne 'push(@lines, $_) if /section2/.../section3/;
                END {pop @lines; print @lines}' /tmp/foo.ini
    [section2]
    c=3
    d=4
    
    Run Code Online (Sandbox Code Playgroud)