Regex Sed从比赛中移除,直到比赛结束

Regex Sed从比赛中移除,直到比赛结束,regex,bash,sed,Regex,Bash,Sed,我想删除文件中从匹配开始(包括第一个匹配)到第二个匹配(不包括第二个匹配)的部分。我的文件如下所示,来自: 从的答案中,我使用了一个sed命令,该命令从####直到4输出。第4行,就在#######之前。但是,我想从文件中删除该部分 为了澄清,我只知道下一节将以##开头,据我所知,它可能是#####) 我试着用删除命令代替打印命令,就像这样 sed -e '/## Screensh/,/##/{/Scree/{d;n};/##/{q};d}' file 但这不起作用,因为它在第二次匹配后停止输

我想删除文件中从匹配开始(包括第一个匹配)到第二个匹配(不包括第二个匹配)的部分。我的文件如下所示,来自:

从的答案中,我使用了一个
sed
命令,该命令从
####
直到
4输出。第4行,就在
#######
之前。但是,我想从文件中删除该部分

为了澄清,我只知道下一节将以
##
开头,据我所知,它可能是
#####

我试着用删除命令代替打印命令,就像这样

sed -e '/## Screensh/,/##/{/Scree/{d;n};/##/{q};d}' file
但这不起作用,因为它在第二次匹配后停止输出,在本例中是因为quit命令。我还尝试使用正则表达式字符类来匹配除
字符以外的任何字符,比如
sed-n'/#Screenshots.[^#]*/p'
,但它只打印
#Screenshots.
类似这样的内容:

sed '/## Screenshot/,/##/{/Screenshot/d;/##/!d}'
就是这样-删除两个匹配之间的所有内容,包括第一个,但不包括最后一个。如果您知道该节以“##Changelog##”结尾,它将变成

sed '/## Screenshot/,/##/{/## Changelog/!d}'
大概是这样的:

sed '/## Screenshot/,/##/{/Screenshot/d;/##/!d}'
就是这样-删除两个匹配之间的所有内容,包括第一个,但不包括最后一个。如果您知道该节以“##Changelog##”结尾,它将变成

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

A
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

A
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

如果与-n一起使用,您的解决方案不也是输出节的脚本的更简单版本吗?例如:
sed-n'/###屏幕截图/,/##/{/Screenshot/p;/##/!p}'
?我不确定是否应该重新询问,但实际上我想在表达式中使用bash变量。这意味着将引号更改为双引号,从而使
我需要为shell转义一个字符,但是
sed-I/{var}/,/{35;/{/Screenshot${var}/d;/{35; sed/\!d}文件
抱怨``是一个未知的命令:(我已经使用它一段时间了,似乎sed可以有一个由几个串联字符串组成的参数:
sed“something”!“something”
对我有用。编辑:谢谢!哦,明白了,只需在同一个命令中使用双引号和单引号,根据您的解决方案,如果与-n一起使用,输出部分的脚本不也是更简单的版本吗?如:
sed-n'/#Screenshot/,/#Screenshot/{/Screenshot/p;/#“
?我不确定是否应该重新询问,但我实际上希望在表达式中使用bash变量。这意味着将引号更改为双引号,这反过来会使
成为我的shell需要转义的字符,但是
sed-I/#屏幕截图${var}/,/#/{/Screenshot${var}/d;/#file
抱怨``是一个未知的命令:(我已经使用它一段时间了,似乎sed可以有一个由几个串联字符串组成的参数:
sed“something”!““something”
为我工作。编辑:谢谢!哦,明白了,只需在同一个命令中使用双引号和单引号,根据or
awk'/###屏幕截图/,/##Changelog/{next}1'文件
@jaypal我以前没有见过这个,谢谢。通常我会尽量避免
awk
中的
/to/,/from/
,因为它限制了其他测试的一些。对于简单的任务
就可以了。或者
awk'/#屏幕截图/,/#更改日志/{next}1'文件
@jaypal我以前没有见过这个,谢谢。通常我会尽量避免
awk
中的
/to/,/from/
,因为它限制了其他测试的一些。对于简单的任务
是可以的。