搜索一个模式,仅替换前两行并删除其余的

搜索一个模式,仅替换前两行并删除其余的

我有一个文件,其中包含未知数量的以“class”开头的行。我想用一些不同的内容替换以“class”开头的前两行内容,并只保留这两行并删除其余的。

例子:

school 
class A
class B
class C
class D
classroom

期望的输出:

school
class X
class Y
classroom

我正在查看 sed 但找不到一个好的解决方案。任何建议将不胜感激!

答案1

使用GNU sed通过扩展正则表达式模式,-E我们可以使用保留空间作为计数器。

sed -Ee '
  /^class(\s|$)/!b
  G
  /\n{3}/d
  /\n{2}/s/.*/class Y/
  /\n{1}/s/.*/class X/
  p;z;H;d
' file

简要说明:

  • 所用命令的编译sedb G z h H d s/// p
  • 有关它们请参阅 GNU sed 手册
  • 想法是继续打印所有不以单词类开头的行
  • 现在,对于阶级线来说,必须消除三件事的歧义——它是被看到一次、两次还是两次以上。
  • 我们将保留空间的内容绑在模式空间上,并密切关注换行符。
  • 如果找到 3 个换行符 => 出现超过 2 次。赶紧删除这一行。不会对其进行进一步处理。
  • 如果找到 2 个换行符 => 第二次看到,所以更改它。
  • 第一次见到也做出了另一个改变。
  • 对于最后两种情况之一,增加保留空间。

随着awk实用性很简单。

awk '
  BEGIN {
    a[1]="class X"
    a[2]="class Y"
  }
  $1 == "class" {
    if ( k++ < 2 ) {
      $0 = a[k]
    } else { next }
  }1
' file

输出:

school 
class X
class Y
classroom

相关内容