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

标签 awk

首先,我知道遵循这种格式的普通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/

相关文章:

bash - 如何在 awk 脚本中的搜索模式中使用变量

regex - awk - 如果下一行与模式不匹配则删除行

linux - awk 在 centOS 7 上就位

unix - sed/awk : Insert some text in a file after the last pattern found

bash - 将终端中同一位置的不同短语大写

awk - 将字符串替换为 sed 或 awk,其中它标识一个模式,如下所述

bash - 从 XML 文件中删除特定的重复行

html - AWK 将 CSV 转换为 HTML 表格

awk - 如果在 file2 中找不到,则在 file1 中查找行

linux - 简单的 sed 替换