仅在第一个匹配模式之前插入新行

Man*_*ath 6 sed text-processing

我的输入文件包含如下数据

acb/xyz/row<t>
acb/xyz/row<t>
abc/xyz/row<b>
abc/xyz/row<b>
abc/xyz/row<0>
abc/xyz/row<0>
abc/xyz/row<1>
abc/xyz/row<1>
abc/xyz/row<2>
abc/xyz/row<2>
abc/xyz/row<3>
abc/xyz/row<3>
abc/xyz/row<4>
abc/xyz/row<4>
Run Code Online (Sandbox Code Playgroud)

所以我希望输出如下所示:

#Sector Top
acb/xyz/row<t>
acb/xyz/row<t>
#Sector Bottom
abc/xyz/row<b>
abc/xyz/row<b>
#Sector 0
abc/xyz/row<0>
abc/xyz/row<0>
#Sector 1
abc/xyz/row<1>
abc/xyz/row<1>
#Sector 2
abc/xyz/row<2>
abc/xyz/row<2>
#Sector 3
abc/xyz/row<3>
abc/xyz/row<3>
#Sector 4
abc/xyz/row<4>
abc/xyz/row<4>
Run Code Online (Sandbox Code Playgroud)
  • 上面显示的每个扇区包含多行,这里我只显示了每个扇区 2 行。
  • 有顶部、底部和从0到30个扇区,这里我最多显示了4个扇区。

我尝试使用 sed 命令来获取其中一个扇区:

sed '/row<1>/i #Sector 1' myfile
Run Code Online (Sandbox Code Playgroud)

这给了我这样的输出:

#Sector 1
abc/xyz/row<1>
#Sector 1
abc/xyz/row<1>
Run Code Online (Sandbox Code Playgroud)

我不需要在每场比赛前换行,只需要在所有部分的第一场比赛前换行。

Ed *_*ton 9

使用任何 awk:

$ cat tst.awk
BEGIN {
    FS = "[<>]"
    map["t"] = "Top"
    map["b"] = "Bottom"
}
{
    sector = $(NF-1)
    if ( sector != prev ) {
        print "#Sector", (sector in map ? map[sector] : sector)
        prev = sector
    }
    print
}
Run Code Online (Sandbox Code Playgroud)

$ awk -f tst.awk file
#Sector Top
acb/xyz/row<t>
acb/xyz/row<t>
#Sector Bottom
abc/xyz/row<b>
abc/xyz/row<b>
#Sector 0
abc/xyz/row<0>
abc/xyz/row<0>
#Sector 1
abc/xyz/row<1>
abc/xyz/row<1>
#Sector 2
abc/xyz/row<2>
abc/xyz/row<2>
#Sector 3
abc/xyz/row<3>
abc/xyz/row<3>
#Sector 4
abc/xyz/row<4>
abc/xyz/row<4>
Run Code Online (Sandbox Code Playgroud)


Mar*_*uet 3

您可以使用 awk 来执行此操作:

awk -F'[<>]' '!seen[$2]++{print "#Sector " $2} {print}' file
Run Code Online (Sandbox Code Playgroud)

如果您需要将 t 替换为 Top,将 b 替换为 Bottom,您可以添加一些条件:

awk -F'[<>]' '{
    if(!seen[$2]++){
        if($2=="t"){
            print "#Sector Top"
        }else if($2=="b"){
            print "#Sector Bottom"
        }else{
            print "#Sector " $2
        }
    }
    print
}' file
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,假设您的产品线中没有更多此类产品< >

这还假设每个扇区都排序在一起,并且您只有数据文件中显示的行。如果您有一个未排序的文件,它不会在第一个匹配后插入新行。