我想删除从匹配开始的文件部分(包括第一个匹配)和第二个匹配(不包括第二个匹配)。我的文件看起来像这样,来自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 ##
。
答案 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