sed删除按字母顺序排列的行



我试着用sed删除所有按字母顺序有任何3个字符的行,有没有一种简单的方法来做到这一点,而不是一堆模式行

sed -i '/abc/d 
/bcd/d
....
/xyz/d' file.txt

对于您尝试的代码,请尝试以下awk代码,其中我们没有编写连续字母的所有组合。恕我直言,awksed更有效。

awk '
BEGIN{
FS=""
num=split("a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z",arr1,",")
for(i=1;i<=num;i++){ letters[arr1[i]]=i }
}
{
for(i=1;i<=NF;i++){
if(($i in letters) && ($(i+1) in letters) && ($(i+2) in letters)
&& (letters[$i]+1==letters[$(i+1)]) && (letters[$i]+2==letters[$(i+2)])
&& (letters[$(i+1)]+1==letters[$(i+2)])){
print $i $(i+1) $(i+2)
}
}
}
'  Input_file

解释:对整个awk程序的简单详细解释如下:

awk程序BEGIN块说明:

  • awk中的所有行创建字段分隔符(FS)为NULL,以便每个字符可以比较以找出连续出现的3个字母。
  • 然后使用awksplit函数创建一个名为arr1的数组,其中将所有字母(小写字母)拆分为,分隔符。
  • 然后开始for循环,直到num的值(也可以写为26,因为字母的数量总是固定的),其中创建一个名为letters的数组,其索引为字母,其值将是它们的位置值(它们发生的数字,例如:对于a,它将是1)。

awk程序主块说明:

  • 从第一个字段运行for循环直到NF当前行的所有字段。

  • 然后检查那里的条件(基本上检查当前字段和下两个字段是否以字母数组形式出现,并检查它们的序列是否连续)。

  • 如果满足上述所有条件,则打印当前和下两个字段(基本打印3个字母)。

这可能适合您(GNU sed):

sed -En '1{x;s/^/abcdefghijklmnopqrstuvwxyz/;x};G;/(...).*n.*1/!P' file

在第一行,在保持空间中引入一个文字字母。

在每行中,附加字母并使用三个字符的反向引用,将其与字母表进行比较。

如果匹配,则删除该行,否则,仅打印第一行。

注意:使用-n关闭隐式打印,因此只有当匹配失败时才打印该行。

最新更新