正则表达式##示例[^] + ### Response`无法匹配

时间:2017-08-03 20:44:20

标签: regex perl

我有大量的降价文件。在这些文件中,我想将某些<div id="menu-full-size"> <div class="close-nav"> <svg viewbox="0 0 40 40"> <path class="close-nav-x" d="M 10,10 L 30,30 M 30,10 L 10,30" /> </svg> </div> <h2>Rest of menu stuff</h2> </div> 替换为### Response

### ResponseNew

所以我尝试使用

### Response
I don't want to replace this Response above to ResponseNew since it is not following Example

## Example
### Request
123{}```

### Response
I want to replace this Response above to ResponseNew since it is following Example

替换为

## Example[^]+### Response

当我在RegExr website中进行测试时,这是有效的。

但是,使用Sublime查找和替换它会显示错误:

  

不匹配[或[^ in character class declaration。发生错误   在解析正则表达式片段时:&#39; #Response&gt;&gt;&gt; HERE&gt;&gt;&gt;&#39;。   在正则表达式中##示例[^] + ###响应

我还尝试在this之后的终端中使用Perl,

$&New

它显示:

  

无与伦比[正则表达式;标记为&lt; - HERE in m / ## Example [&lt; - HERE   ^] + ###响应/在-e第1行。

如何正确编写正则表达式以便匹配?感谢

2 个答案:

答案 0 :(得分:1)

如果文件不是太大

perl -0777 -wpe's/## Example.*?### Response\K/New/sg' markdown.txt

使用提供的输入打印正确的输出。

/s修饰符也会使.与换行符匹配,\K会使之前的匹配失败,因此您不必更换&#34;替换&#34 ;他们。因此,一旦匹配,它会New直接绑定到Response-0777开关会将整个文件粘贴到$_,以便跨多行工作。

如果### Response可能出现在一条线的中间,而您又不想触摸它

perl -0777 -wpe's/## Example.*?^### Response\K/New/smg' markdown.txt

其中/m修饰符使^匹配每行的开头,而不仅仅是整个字符串的开头。

如果文件 太大而无法进入变量,请在找到## Example时设置一个标志,然后找到### Response一次(标志为true)替换它并取消了国旗。

如果必须的话,这在oneliner中是可行的,但我建议使用简短的脚本。

答案 1 :(得分:1)

在逐行和slurp模式之间,您还可以定义自己的记录分隔符并选择/_ah/health。然后,您所要做的就是为每条记录替换第一次出现的## Example

### Response