作业帮 > 综合 > 作业

sed提取提定标记间的段落

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/08/23 03:29:55
sed提取提定标记间的段落
文本如下:
#
a
b
c
#
#
c
d
e
#
#
f
g
h
#
用sed -n '/#/,/#/p'可以输出:
#
a
b
c
#
问:怎么可以输出下面两个#之间的段落.
sed -n '/#/{N;:1;/#\n\(.*\n\)*#/{p;b};N;b1}' file
再问: 有此复杂,大侠能解释下吗?
再答: -n
不输出任何行
/#/
当行是#,N;读取下一行,:1创建一个标签,名字为1(此时无动作)。再判断,如果模式空间内容满足【#a回车b回车c回车...#】(abc等为任意字符),p输出,并b结束脚本命令。读取下一行文件内容。
如果行不满足上面的内容,那N;读取下一行,转到标签b1位置。
再进行判断,如果还不满足【#a回车b回车c回车...#】,再读取下一行,直到读取到#,打印输出结束。--------------------------------------------------------------------我又想出一个优化后的命令:原来命令:sed -n '/#/{N;:1;/#\n\(.*\n\)*#/{p;b};N;b1}' file更简命令:
sed -n '/#/{:1;N;/#[^#]*#/{p;b};b1}' file这个思路跟上面的一样。优化的是:通过调换标签位置,将上面的两个N变成了下面的一个N。正则表达式:[^#]表示为除了#的任意字符,包含了换行。