sed / foo /,/ bar / *匹配跨文件边界

时间:2016-02-03 14:48:47

标签: regex sed

我的文件* .txt包含内容

blah blah. Management blah
stuff I don't want blah

Management 09/10/15
stuff I do want

Overview

使用

处理单个文件时
sed -nr '/Management.[0-9]/{:a;n;/Overview/b;p;ba}' 1.txt

我得到了

stuff I want

使用相同的命令处理多个文件时

sed -nr '/Management.[0-9]/{:a;n;/Overview/b;p;ba}' *.txt

我得到了

stuff I don't want blah

Management 09/10/15
stuff I do want

是什么给出的?我需要像

这样的东西
/Management[[:space:]][0-9]

但是不能理解如何将其纳入SED。 我想我昨晚有这个,然后关闭而没有保存。 (但是,我没有仔细检查数据,可能会错过一些东西。尝试从bash历史重建,这使我在这里)。

这些文本文件是从PDF转换而来的,空格可能不会中断。

2 个答案:

答案 0 :(得分:1)

/Management*[0-9]/是一个shell glob模式,其中*表示“零个或多个任何字符”。有关详细信息,请参阅https://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matching

您需要sed正则表达式,记录在https://www.gnu.org/software/sed/manual/sed.html#Regular-Expressions

/Management \+[0-9]/

这就是管理这个词,后跟一个或多个空格,后跟一个数字。

答案 1 :(得分:0)

如果您希望材料位于包含Management的行与至少一位数之间,而下一行包含Overview,则您要求sed生成该材料:

sed -n -e '/Management.*[0-9]/,/Overview/ { /Overview/d; p; }'

给定文件data包含:

blah blah. Management blah
stuff I don't want blah

Management 09/10/15
stuff I do want

Overview
Not wanted
Please ignore

我得到的输出是:

$ sed -n -e '/Management.*[0-9]/,/Overview/ { /Overview/d; p; }' data data
Management 09/10/15
stuff I do want

Management 09/10/15
stuff I do want

$