【问题标题】:Remove everything between specified characters including multi lines删除指定字符之间的所有内容,包括多行
【发布时间】:2019-04-25 06:04:09
【问题描述】:

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

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

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

这只会删除一行中的部分:

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

如何也删除多行内容?

P.S 我在 MAC 上

【问题讨论】:

  • 可能 perl 解决方案会更简单:perl -0pe 's/##.*?##\R*//gs' file > newfile (demo)。
  • @WiktorStribiżew 嘿,您的解决方案效果最好 - 发布您的答案,我会接受。谢谢!

标签: regex perl awk sed


【解决方案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 

【讨论】:

    【解决方案2】:

    试试这个:

    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】:

      您可以使用perl 来实现您想要的:

      perl -0pe 's/##.*?##\R*//gs' file > newfile
      

      online demo

      0 参数可以跨行查找匹配项。

      模式匹配

      • ## - 两个 # 符号
      • .*? - 尽可能少的任何 0+ 个字符(甚至是由于 s 修饰符而导致的换行符)
      • ## - 两个 # 符号
      • \R* - 任何 0+ 换行序列。

      【讨论】:

        【解决方案4】:

        这对awk 来说应该是一件很容易的事(如果你没问题的话)。能否请您尝试以下,稍后也会添加说明。

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

        现在也添加非单线形式的解决方案。

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

        【讨论】:

          猜你喜欢
          • 2015-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-10-24
          • 1970-01-01
          相关资源
          最近更新 更多