如果上一行以字符开头,则匹配

时间:2012-09-26 09:18:16

标签: regex grep line

我有一个文件,如下所示:

expression1
- expresson1.1
- expressoion1.2
expression2
-expression2.1
expression3
-expression3.1
-expression3.2
-expression3.3

我想要做的是,删除第1.2,3.2和3.3行,所以只有不以减号开头的行,而下一行仍然存在。

所以我尝试编写一个正则表达式,匹配以减号开头的每一行,其中前一个也以减号开头,然后删除它们。

到目前为止,没有成功。任何提示都将非常感激。

3 个答案:

答案 0 :(得分:1)

如果您接受awk解决方案,请查看以下单行:

awk '/^[^-]/{f=1;print;next;}{if(f && $0~/^-/){print;f=0;}}' yourFile

<强>测试

kent$  echo "expression1
dquote> - expresson1.1
dquote> - expressoion1.2
dquote> expression2
dquote> -expression2.1
dquote> expression3
dquote> -expression3.1
dquote> -expression3.2
dquote> -expression3.3
dquote> "|awk '/^[^-]/{f=1;print;next;}{if(f && $0~/^-/){print;f=0;}}'
expression1
- expresson1.1
expression2
-expression2.1
expression3
-expression3.1

答案 1 :(得分:1)

您可以使用此正则表达式:

/(-.+)\s((-.+)?(\s|))+/g

用以下内容替换比赛:

$1\n

您可以使用RegExr here查看此正则表达式。

P.S。棘手的问题,这里看起来没有用,因为你没有固定长度的前缀来匹配,而lookbehind(和lookahead)需要固定长度的字符串,如指出here(靠近页面的末尾)。 / p>

答案 2 :(得分:0)

根据您的正则表达式风格,可能有一种方法可以激活多线模式。在这种情况下,^$除了整个字符串的开头和结尾外还匹配行的开头和结尾。

/^-.*$\n((^-.*$\n?)+)/

这应至少匹配以-开头的两个连续行。第一个捕获/子模式包含第一个之后的所有行。所以这些匹配就是你要删除的内容。

当然,将\n替换为适合您系统的行结尾。