【问题标题】:How do I remove a particular pattern with a number sequence sed如何删除带有数字序列 sed 的特定模式
【发布时间】:2021-06-09 19:26:58
【问题描述】:

我对 sed bash 命令很陌生,所以努力学习。

我目前面临着需要清理的几千个降价文件,我正在尝试创建一个删除以下部分内容的命令

# null 864: Headline
body text

我需要删除标题之前的任何内容,即“# null 864:” 总是:'# null'然后是一些数字':' 我使用的是 gnu-sed,因为我使用的是 mac

到目前为止我想出的最好的是

gsed -i '/#\snull\s([1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]):\s/d' *.md

上面的好像不行?

如果我这样做了

gsed -i '/#\snull/d' *.md

它做了我想要的,但是它在身体测试中做了一些意想不到的事情。

如何控制只保留标题和正文?

【问题讨论】:

    标签: regex sed


    【解决方案1】:

    考虑到您想在标题之前打印值并且不想打印任何其他行,然后尝试以下操作。

    sed -E -n 's/^(#\s+null\s+[0-9]+:\s+)Headline/\1/p' Input_file
    

    如果您想在标题之前打印值并且如果找不到匹配项想要打印该完整行,请尝试以下操作:

    sed -E 's/^(#\s+null\s+[0-9]+:\s+)Headline/\1/' Input_file
    

    说明: 简单地使用sed-E 选项来启用ERE(扩展正则表达式),然后使用seds 选项来执行在这里替换。匹配 # 后跟空格 null 后跟空格数字冒号和空格并将其保留在第一个捕获组中,而替换时,将其替换为第一个捕获组。

    注意: 上面的命令将在终端上打印值,如果您想将它们保存在适当的位置,那么一旦您对上面的代码输出感到满意,请使用-i 选项。

    【讨论】:

      【解决方案2】:

      如果我理解正确的话,你有这样的文件:

      This should get deleted
      This should too.
      # null 864: Headline
      body text
      this should get kept
      

      您想保留标题以及之后的所有内容,对吗?您可以在 awk 中执行此操作:

      awk '/# null [0-9]+:/,eof {print}' foo.md
      

      【讨论】:

        【解决方案3】:

        您可以使用 awk,并使用 sub 将 # null 864: 部分替换为空字符串。

        请参阅this page 以创建新文件或覆盖同一文件。

        }1 打印整行,因为 1 的计算结果为真。

        awk '{sub(/^# null [0-9]+:[[:blank:]]+/,"")}1' file
        

        模式匹配

        • ^# null 从字符串的开头逐字匹配
        • [0-9]+:[[:blank:]]+ 匹配 1+ 个数字,然后是 : 和 1+ 个空格

        输出

        Headline
        body text
        

        【讨论】:

          【解决方案4】:

          在 mac 上应该默认安装 ed

          script.ed的内容

          g/^# null [[:digit:]]\{1,\}: Headline$/s/^.\{1,\}: //
          ,p
          Q
          

          for file in *.md; do ed -s "$file" < ./script.ed; done
          

          如果输出正常,删除,p 并将Q 更改为w,以便它可以编辑文件就地

          g/^# null [[:digit:]]\{1,\}: Headline$/s/^.\{1,\}: //
          w
          

          再次运行循环。

          【讨论】:

            【解决方案5】:

            我会在 sed 中使用一个范围,与 Andy Lester 的 awk 解决方案相同。
            借用他的档案,

            $: cat tst.md
            This should get deleted
            This should too.
            # null 864: Headline
            body text
            this should get kept
            
            $: sed -Ein '/^# null [0-9]+:/,${p;d};d;' tst.md
            $: cat tst.md
            # null 864: Headline
            body text
            this should get kept
            

            【讨论】:

              猜你喜欢
              • 2017-01-04
              • 1970-01-01
              • 1970-01-01
              • 2016-10-07
              • 1970-01-01
              • 1970-01-01
              • 2021-07-22
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多