【问题标题】:sed match 3 lines patterns and delete 2sed 匹配 3 行模式并删除 2
【发布时间】:2015-04-10 10:08:58
【问题描述】:

我正在尝试匹配匹配 3 种不同模式的 3 行,一个接一个,并使用 sed 仅删除第一个和最后一个:

patternABC
patternDEF
patternGHI

我正在使用这样的东西,当然会删除所有行,但我需要离开 patternDEF 并只删除 patternABC 和 patternGHI。

sed -e '/patternABC/{N;/patternDEF/{N;/patternGHI/d}}'

【问题讨论】:

  • 所以如果 line1、line2 和 line3 完全匹配,您只想保留 line2?最好提供一个更广泛的示例以及所需的输出,以使其更加清晰。
  • 是的,如果我有 line1、line2 和 line3 我想删除 line1 和 line3 并且只剩下 line2 作为输出
  • 是否存在 3 种不同的模式或单个模式出现 3 次?
  • 3 种不同的模式,因为我以不同的方式命名它们,比方说
     abc def ghi 
    所以我想删除匹配“abc”和“ghi”的行,前提是它们之间有 "def" ,所以技术上我想离开 "def"
  • 不要在 cmets 中澄清问题:只需使用“编辑”按钮更新它。这对每个人都是最好的:你会得到更多的关注,可能的回答者也会有更清晰的视野。

标签: regex bash sed


【解决方案1】:
sed -e '/patternABC/{
           N
           /\n.*patternDEF/{
              N
              /.*patternABC.*\(\n.*patternDEF.*\)\n.*patternGHI.*/ {
                 s//\1/
                 }
              }
           }' YourFile
  • 假设后面有 3 行,并且您没有像 line1+line1+line2+line3 这样的东西
  • s// 是示例,它可以直接集成最后一级模式测试(因此只需要 2 级模式匹配 + 1 次替换)。
  • d 不能直接使用,因为它会立即删除整个缓冲区内容,并且缓冲区通常是当前行,除非您像 N 操作向当前缓冲区添加一些内容
    • pattern 现在是您对使用正则表达式的担忧(<pre> abc def ghi </pre> 是 1 行,因此此代码无法工作,因为它需要 3 行)

【讨论】: