【问题标题】:Delete a pattern in a file and lines before it using some other pattern使用其他模式删除文件中的模式和行
【发布时间】:2022-12-18 00:30:52
【问题描述】:

我有一个包含这个的文本文件:-

# Comment
# Comment
# Comment
property1

# Comment
# Comment
property2

我想使用 unix 命令(awk/sed 等)来搜索具有 property2 的模式,然后删除它之前的所有 cmet。因此,操作后的输出应该是:-

# Comment
# Comment
# Comment
property1

这是我尝试过的(使用 awk 命令):-

awk -v pat='^property2' -v comment='^#' '$1~pat{p=NR} p && NR>=p-3{del=($1~comment)} del{next} 1' test.txt

基本上,我尝试使用的逻辑是:-

  1. 搜索属性 2
  2. 然后循环之前的 3 行
  3. 搜索是否为评论(#开头)
  4. 删除那些行(包括搜索到的模式和上面的 cmets)。

    有人可以帮助我实现这一目标吗?谢谢。

【问题讨论】:

  • 请阅读how-do-i-find-the-text-that-matches-a-pattern,然后阅读edit你的问题,用你的意思替换pattern。您的示例看起来应该匹配一个字符串,但您的代码正在尝试匹配一个正则表达式。
  • 您的描述与您的示例不准确——请澄清。

标签: shell unix awk sed


【解决方案1】:

您可以使用可编写脚本的编辑器(例如 ed)来:

  1. 搜索property2的第一个匹配项(锚定到行首)
  2. 从那里向后搜索一行不是#开始
  3. 来自行这一行直到以property2 开头的行,删除这些行
  4. write 文件到磁盘
  5. quit 编辑

    一种写法是:

    #!/bin/sh
    
    printf '%s
    '             
            '/^property2'     
            '?^[^#]'          
            '+1,/^property2/d' 
            'w'               
            'q'               
      | ed input > /dev/null
    

    我已将 ed 的标准输出删除到 /dev/null,因为它会报告它沿途匹配的行,我们对此不感兴趣。ed 将“就地”对文件进行更改”。如果property2 之前没有非空、非注释行,则此 ed 脚本将失败(向后搜索将失败)。

    在您的示例输入中,这也将删除节之间的空白行,这似乎与您想要的输出相匹配。

【讨论】:

    【解决方案2】:

    目前尚不清楚您要做什么;也许就是这样:

    Mac_3.2.57$cat test.txt
    # Comment1
    # Comment2
    # Comment3
    property1
    
    # Comment4
    # Comment5
    property2
    Mac_3.2.57$awk '{if(NR==FNR){{if($0!~/^#/&&startFound==1){startFound=0;end=NR};if($0~/^#/&&startFound==0){startFound=1;start=NR}}}else {if(FNR<start||FNR>=end){print}}}' test.txt test.txt
    # Comment1
    # Comment2
    # Comment3
    property1
    
    property2
    Mac_3.2.57$
    

    【讨论】:

      【解决方案3】:

      这,使用任何 awk,可能是你想要做的,但你的问题并不清楚:

      $ awk -v RS= -v ORS='
      
      ' -F'
      ' '$NF != "property2"' file
      # Comment
      # Comment
      # Comment
      property1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-16
        • 2012-04-25
        • 2020-06-12
        • 1970-01-01
        • 1970-01-01
        • 2017-02-20
        • 2023-01-26
        相关资源
        最近更新 更多