Bash 如何使用shell命令在匹配行之后获取一些行

Bash 如何使用shell命令在匹配行之后获取一些行,bash,sed,Bash,Sed,我有一个配置,里面有这样的内容 [a] url1 url2 [b] url3 url4 节后的行是可变的。如何获取节的行。在sed命令中,有一种使用循环的方法 sed -n '/\[a\]/{:x;n;s/\[.\]//;t;p;b x;}' inputfile 使用awk命令,命令如下: awk '/\[.\]/{f=0}f==1{print $0}/\[a\]/{f=1}' inputfile 模式出现的顺序很重要。这可能适合您(GNU-sed): 关闭隐式打印-n,因为这是一个筛选

我有一个配置,里面有这样的内容

[a]
url1
url2

[b]
url3
url4

节后的行是可变的。如何获取节的行。

sed
命令中,有一种使用循环的方法

sed -n '/\[a\]/{:x;n;s/\[.\]//;t;p;b x;}' inputfile
使用
awk
命令,命令如下:

awk '/\[.\]/{f=0}f==1{print $0}/\[a\]/{f=1}' inputfile
模式出现的顺序很重要。

这可能适合您(GNU-sed):

关闭隐式打印
-n
,因为这是一个筛选操作

当遇到以
[a]
开头的行时,如果该行没有以
[
开头,则打印该行并获取下一行

另一种选择:

sed '/^\[/h;G;/^\[a\]/MP;d' file
如果空行定义了节的结尾:

sed -n '/^\[a\]/{:a;p;n;/^\[\|^$/!ba}' file

如果空白行不包含任何空格,则<代码> AWK 非常适合于此任务。如果空白行包含空白,则应对输入进行预过滤,使其不:

$ cat input

[a]
url1
url2

[b]
url3
url4
$ awk '$1=="[a]"' RS= input
[a]
url1
url2
$ awk '$1=="[b]"' RS= input
[b]
url3
url4

这很接近:
sed-n“/\[a]/,/\[.]/p”您的\u文件
。顺便说一句,如果您正在使用
bash
shell,您应该标记
bash
,因为它比
shell
@lower获得的流量要多得多,但是[a]和[b]都是打印的,我只能在[b]之前的[a]之后打印URL吗这是一条帮助你开始的评论,这就是为什么我没有把它作为一个完整的答案发布。我不想为你做所有的工作。:)你应该做一点实验,想想如何摆脱我的例子中的
[a]
[b]
。它确实已经缩小到了你想要的部分。
$ cat input

[a]
url1
url2

[b]
url3
url4
$ awk '$1=="[a]"' RS= input
[a]
url1
url2
$ awk '$1=="[b]"' RS= input
[b]
url3
url4