我有一个文件,其中包含未知数量的以“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
简要说明:
- 所用命令的编译
sed
:b 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