我有一个文件,其内容如下:
## this must go ##
## also
this
must go
##
hello world
##and this one
too##
我想删除 ## 之间的所有内容,包括多行,所以我只剩下hello world
这仅删除一行上的部分:
sed -i.bak 's/##.*##//g' myfile
如何也删除多行内容?
MAC上的PS Im
答案 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