打印配置文件部分的最小awk程序是什么?
首先,我知道遵循这种格式的普通conf文件(我不知道它叫什么)通常有一个空行分隔部分,这使得这个问题变得容易得多。但我想知道是否有一种小而干净的方法可以在awk中只打印以下文件的第2部分(称为test.conf): 我的第一个猜测失败了:打印配置文件部分的最小awk程序是什么?,awk,Awk,首先,我知道遵循这种格式的普通conf文件(我不知道它叫什么)通常有一个空行分隔部分,这使得这个问题变得容易得多。但我想知道是否有一种小而干净的方法可以在awk中只打印以下文件的第2部分(称为test.conf): 我的第一个猜测失败了: bash-3.2$ awk '/^\[section2\]$/,/^\[/' test.conf [section2] 因为同一行同时匹配起始和结束范围分隔符。我觉得有一种更好的方法可以做到这一点,而不是在进入第2节时设置一些变量,然后在进入下一节时将其关闭
bash-3.2$ awk '/^\[section2\]$/,/^\[/' test.conf
[section2]
因为同一行同时匹配起始和结束范围分隔符。我觉得有一种更好的方法可以做到这一点,而不是在进入第2节时设置一些变量,然后在进入下一节时将其关闭。有人知道吗?这个应该可以
awk '/\[section2\]/,/\[section3\]/{if ($0 !~ /\[section3\]/) print}' test.conf
或者更容易使用sed
sed -n '/\[section2\]/,/\[section3\]/{/\[section3\]/!p}' test.conf
AWK解决方案
通常不能保证其部分的顺序,因此以下内容有些脆弱,因为它依赖于顺序。但是,它非常短,并且适用于您定义的语料库
$ 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 -vRS=[ /section2/ test.conf
结果并不完美:
section2]
c = 3
d = 4
另一个命令:
awk -vRS=[ '/section2/{print RS$0}' test.conf
另一个
awk
awk '/section3/ {exit} /section2/ {f=1} f' /tmp/foo.ini
不是最短的一个,但至少节顺序不会破坏它:
$ awk '/^\[section2/ {p=1; next}; /^\[/ {p=0}; p' test.conf
c = 3
d = 4
并且适用于每个awk。请使用printf而不是print,以避免记录末尾出现多余的换行符。但是,为了有效地使用RS来查找节,+1。这是一个gawk解决方案,并非所有awk都支持这种类型的RSAdding
-F“section2]”
,执行{print$2}
将去掉节头,但在有用的输出前后都会有空行。@Jotne,这是一个简单的单字符RS
,据我所知,应该得到很好的支持。编辑:你的意思是-v选项,好的。谢谢你的回答!我不知道触发器运算符是什么,但我将进一步了解它。
$ awk '/^\[section2/ {p=1; next}; /^\[/ {p=0}; p' test.conf
c = 3
d = 4