Sed从匹配中删除直到匹配

时间:2014-03-13 12:41:33

标签: regex bash sed

我想删除从匹配开始的文件部分(包括第一个匹配)和第二个匹配(不包括第二个匹配)。我的文件看起来像这样,来自another SO question

3. line 3
4. line 4
## Screenshots ##
1. line 1
2. line 2
3. line 3
4. line 4
## Changelog ##
3. line 3
4. line 4

the other question的答案中,我已经sed命令从## Screenshots ##输出4. line 4,就在## Changelog ##之前。但是,我想从文件中删除该部分。

为了澄清,我只知道下一部分将以##开头,对于我知道的所有内容,它可能是## foobar ##。)

我试图通过删除命令替换打印命令,如此

sed -e '/## Screensh/,/##/{/Scree/{d;n};/##/{q};d}' file

但是这不起作用,因为它在第二次匹配后停止输出,在这种情况下## Changelog ##(因为退出命令)。我还尝试使用正则表达式字符类来匹配除#之类的sed -n '/## Screenshots ##[^#]*/p'字符,但只打印## Screenshots ##

3 个答案:

答案 0 :(得分:4)

这样的事情:

sed '/## Screenshot/,/##/{/Screenshot/d;/##/!d}'

就是这样 - 删除两个匹配之间的所有内容,包括第一个但不包括最后一个。如果您知道该部分以'## Changelog ##'结尾,则它变为

sed '/## Screenshot/,/##/{/## Changelog/!d}'

答案 1 :(得分:1)

sed版本:

sed '/## Screenshot/,/## Changelog/d' file
3. line 3
4. line 4
3. line 3
4. line 4

awk版本

awk '/## Screenshots/{f=1;next} !f; /## Changelog/{f=0}' file
3. line 3
4. line 4
3. line 3
4. line 4

答案 2 :(得分:1)

$ sed '/## Screenshots ##/,/## Changelog ##/d' test.txt
3. line 3
4. line 4
3. line 3
4. line 4