我有一个文件,如下所示:
expression1
- expresson1.1
- expressoion1.2
expression2
-expression2.1
expression3
-expression3.1
-expression3.2
-expression3.3
我想要做的是,删除第1.2,3.2和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
替换为适合您系统的行结尾。