删除指定字符之间的所有内容,包括多行

时间:2018-11-22 14:16:40

标签: regex perl awk sed

我有一个文件,其内容如下:

## this must go ##
## also
 this
 must go
##
hello world
##and this one
too##

我想删除 ## 之间的所有内容,包括多行,所以我只剩下hello world

这仅删除一行上的部分:

sed -i.bak 's/##.*##//g' myfile

如何也删除多行内容?

MAC上的PS Im

4 个答案:

答案 0 :(得分:2)

您可以使用if (A + B + C == triagolnik && (A == 90 || B == 90 || C == 90)) printf("PRAVOAGOLEN\n"); 来实现所需的目标:

perl

请参见online demo

perl -0pe 's/##.*?##\R*//gs' file > newfile 参数使跨行查找匹配成为可能。

模式匹配

  • 0-两个##符号
  • #-尽可能少的0 +字符(由于.*?引起的换行符)
  • s-两个##符号
  • #-任何0+个换行符序列。

答案 1 :(得分:1)

对于awk,这应该是一件非常容易的事情(以防万一)。您能否请尝试以下内容,也将在不久后添加说明。

awk '/^##.*##$/{next} /^##$/{flag="";next} /^##/ && !/##$/{flag=1} flag{next} 1' Input_file

现在也添加一种非衬套形式的解决方案。

awk '
/^##.*##$/{
  next
}
/^##$/{
  flag=""
  next
}
/^##/ && !/##$/{
  flag=1
}
flag{
  next
}
1
'   Input_file

答案 2 :(得分:1)

尝试一下:

sed -n '/^##/ { :1 ; /##$/ { d } ; n ; b 1 } ; p' myfile

明智的人阅读了这篇出色的教程:Sed - An Introduction and Tutorial by Bruce Barnett

测试:

sed -n '/^##/ { :1 ; /##$/ { d } ; n ; b 1 } ; p' myfile

hello world

答案 3 :(得分:1)

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

sed -z 's/##[^#]*\(#[^#][^#]*\)*##\n\?//g' file

-z选项允许将整个文件添加到sed的模式空间中。正则表达式匹配分为三个部分。第一部分与##相匹配,后跟零个或多个非#。第二部分匹配零个或多个字符组,这些字符组由单个#和一个非{#之后的零个或多个非#组成。第三部分匹配##和可能的换行符。此正则表达式会在整个文件中全局删除此类匹配项。

可以使用-r选项将最终产品添加到以下内容,从而略微缩短此时间:

sed -rz 's/##[^#]*(#[^#]+)*##\n?//g' file

如果sed版本不提供任何一个选项,则另一种解决方案是:

sed 'H;$!d;x;s/.//;s/##[^#]*\(#[^#][^#]*\)*##\n\?//g' file

请注意,在上面的示例中,所有##都在行的开头或结尾处开始或结束,因此下面的解决方案也可能适用:

sed 's/^##/,/##$/d' file