首先,我知道遵循这种格式的正常conf文件(我不知道它叫什么)通常有一个空行分隔部分,这使得这个问题变得容易多了。但我想知道是否有一种小而干净的方法只能在awk中打印以下文件的section2(称为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]
因为同一行匹配起始和结束范围分隔符。我觉得有一个更好的方法来做到这一点,而不是设置一些变量,当你到达section2然后在你到达下一部分时关闭它。有人知道吗?
答案 0 :(得分:5)
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
答案 1 :(得分:3)
这应该这样做
awk '/\[section2\]/,/\[section3\]/{if ($0 !~ /\[section3\]/) print}' test.conf
或使用sed更容易
sed -n '/\[section2\]/,/\[section3\]/{/\[section3\]/!p}' test.conf
答案 2 :(得分:2)
你可以试试这个:
awk -vRS=[ /section2/ test.conf
结果并不完美:
section2]
c = 3
d = 4
另一个命令:
awk -vRS=[ '/section2/{print RS$0}' test.conf
答案 3 :(得分:1)
不是最短的,但至少部分排序不会破坏它:
$ awk '/^\[section2/ {p=1; next}; /^\[/ {p=0}; p' test.conf
c = 3
d = 4
适用于每个awk。
答案 4 :(得分:0)
另一个awk
awk '/section3/ {exit} /section2/ {f=1} f' /tmp/foo.ini