2014-03-13 43 views
1

我想删除从比赛(包括第一场比赛)开始直到第二场比赛(不包括第二场比赛)的部分文件。我的文件是这样的,从another SO questionSed从比赛中删除,直到比赛结束

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 ##

回答

4

事情是这样的:

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

这就是它 - 删除两场比赛之间的一切,包括第一,但不包括最后一个。如果您知道该节以 '##更新日志##' 则变为

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

难道不是你的解决方案也是一个简单版本的脚本,用于输出与-n一起使用的部分?如:'sed -n'/ ## Screenshot /,/ ##/{/ Screenshot/p;/## /!p}''? – Zsub

+1

是的,也应该在那里工作。 – aragaer

+0

不知道我是否应该重新提问,但我真的想在表达式中使用bash变量。这意味着将引号改为双引号,这反过来又使'''我需要为我的shell转义一个字符,但'sed -i“/ ##屏幕截图$ {var} /,/ ##/{/Screenshot $ {var}/d;/##/\!d}“file'抱怨'\'是一个未知的命令:( – Zsub

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 
+1

或'awk'/ ##截图/,/ ##更新日志/ {next} 1'文件' –

+0

@jaypal我以前没见过这个,谢谢。我试图避免'awk'中的'/ to /,/ from /',因为它限制了其他测试的使用。对于简单的任务','没有问题。 – Jotne

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