替换匹配的START END行

时间:2019-12-25 09:54:10

标签: regex shell perl awk sed

我试图替换多行中的两个匹配模式,仅替换匹配的startend行,并将行保持在startend之间。

我试图使用sed,awk,Python,Perl从此处组合一些答案,但是没有运气。

这就是我所拥有的:

other text

```term
command1
```

other text

```term
command1
command2
```

other text

```js
code
```

替换的文本应如下所示:

other text

{{< terminal >}}
command1
{{< /terminal >}}

other text

{{< terminal >}}
command1
command2
{{< /terminal >}}

other text

```js
code
```

基本上,我想用term with `{{< terminal >}}` and替换包含{{< /terminal >}}的每条匹配行。

我无法简单地搜索并替换包含startend模式的行,因为end可以匹配我要保留的其他start行。

4 个答案:

答案 0 :(得分:3)

请您尝试以下。

.icon{
  filter: invert(48%) sepia(79%) saturate(2476%) hue-rotate(86deg) brightness(118%) contrast(119%);
}

代码处理的是什么:

  • 它将查找成对的字符串,如果找到了一对,则只会更改其值。
  • 如果一对未完成,则它也会照原样打印这些行的值(基本上没有更改的行)。

说明: 在此处添加上述代码的详细说明。

awk -v start="{{< terminal >}}" -v end="{{< /terminal >}}" '
/```/ && found==""{
  if(rest_of_values){
    print rest_of_values
    rest_of_values=""
  }
  found=1
  val1=$0
  next
}
/```/ && found==1{
  print start ORS rest_of_values ORS end
  rest_of_values=found=""
  next
}
{
  rest_of_values=(rest_of_values?rest_of_values ORS:"")$0
}
END{
  if(rest_of_values){
    print val1 ORS rest_of_values
  }
}
'  Input_file

答案 1 :(得分:2)

perl版本:

while (<>){
    if  (/```term/ ... /```/){
        if  (/```term/){
            print "{{< terminal >}}\n";
            next;
        } elsif (/```/) {
            print "{{< /terminal >}}\n";
            next;
        }
    }
    print;
}

运行命令:

perl test.pl input-file

答案 2 :(得分:1)

这可能对您有用(GNU sed):

sed -i '/^```term/{s//{{< terminal >}}/;:a;n;/^```/!ba;s//{{< \/terminal >}}/}' file

搜索以```term开头的行,将其替换为{{< terminal >}},继续获取和打印行,直到以```开头的行并用{{< /terminal >}}替换。其他所有行均正常打印。

答案 3 :(得分:0)

只需尝试一下:(Nested START END doesn't work and there is no sample/question also

$str=~s/((\`\`\`)term)((?:(?!\2).)*)(\2)/\{\{< terminal >\}\}$3\{\{<\/ terminal>\}\}/gs;

   ((\`\`\`)term) #  Start match ```term
   ((?:(?!\2).)*)#  Not equal to ```
   (\2)#  End Match```