linux SED:在两个模式之间粘贴线>sed跳过下一个模式匹配

9jyewag0  于 2022-12-11  发布在  Linux
关注(0)|答案(1)|浏览(129)

我有以下场景
sed -n '/*SET_PART/,/*/p' Inputfile > Outputfile
因此,我正在搜索以包含“SET_PART”的行开始并以包含“"的行结束的段落。(在我的场景中,出现“*”总是新段落的符号)
示例:输入文件

*SET_PART_COLLECT_TITLE
    Gesamtfahrzeug
           101                                        
       1005043   1005049   1005101   1005102   1005103   1005200   1005300   1005400
       1005504   1005601   1005700   1005800   1005900   1006000   1006100   1006101
       1006102   1006103   1006200   1006201   1006202   1006203   1006400   1006401
       1006402   1006500   1006600   1006700   1006800   1006900   1007000   1007100
       1007200   1007201   1007202   1007203   1007204   1007300   1007301   1007302
       1007303   1007304   1007305   1007306   1007307   1007308   1007309   1007310
       1007311   1007312   1007313   1007314   1007400   1007500   1007600   1007700
       1007800   1007801   1015700   1015800
    *Keyword
           202                                        
       1000000   1002002   1002312   1002313   1002323   1002701
    
    
    *SET_PART_COLLECT_TITLE
    Verbindungstechnik_Slave
           201                                        
       1000000   1002002   1002312   1002313   1002323   1002701
    *SET_PART_LIST_TITLE
    Bord_stein_hi_Forcetransducer
             3        0.        0.        0.        0.
             3
    *SET_PART_COLLECT_TITLE
    *SET_PART_LIST_TITLE
    Fahrbahn_Forcetransducer
             1                                        
             1
    *END

使用当前的命令行,我得到:输出文件

*SET_PART_COLLECT_TITLE
    Gesamtfahrzeug
           101                                        
       1005043   1005049   1005101   1005102   1005103   1005200   1005300   1005400
       1005504   1005601   1005700   1005800   1005900   1006000   1006100   1006101
       1006102   1006103   1006200   1006201   1006202   1006203   1006400   1006401
       1006402   1006500   1006600   1006700   1006800   1006900   1007000   1007100
       1007200   1007201   1007202   1007203   1007204   1007300   1007301   1007302
       1007303   1007304   1007305   1007306   1007307   1007308   1007309   1007310
       1007311   1007312   1007313   1007314   1007400   1007500   1007600   1007700
       1007800   1007801   1015700   1015800
    *Keyword
    *SET_PART_COLLECT_TITLE
    Verbindungstechnik_Slave
           201                                        
       1000000   1002002   1002312   1002313   1002323   1002701
    *SET_PART_LIST_TITLE
    *SET_PART_COLLECT_TITLE
    *SET_PART_LIST_TITLE

所需的输出为:(所有以“*SET_PART”开头的段落。)

*SET_PART_COLLECT_TITLE
    Gesamtfahrzeug
           101                                        
       1005043   1005049   1005101   1005102   1005103   1005200   1005300   1005400
       1005504   1005601   1005700   1005800   1005900   1006000   1006100   1006101
       1006102   1006103   1006200   1006201   1006202   1006203   1006400   1006401
       1006402   1006500   1006600   1006700   1006800   1006900   1007000   1007100
       1007200   1007201   1007202   1007203   1007204   1007300   1007301   1007302
       1007303   1007304   1007305   1007306   1007307   1007308   1007309   1007310
       1007311   1007312   1007313   1007314   1007400   1007500   1007600   1007700
       1007800   1007801   1015700   1015800
    *SET_PART_COLLECT_TITLE
    Verbindungstechnik_Slave
           201                                        
       1000000   1002002   1002312   1002313   1002323   1002701
    *SET_PART_LIST_TITLE
    Bord_stein_hi_Forcetransducer
             3        0.        0.        0.        0.
             3
    *SET_PART_COLLECT_TITLE
    *SET_PART_LIST_TITLE
    Fahrbahn_Forcetransducer
             1                                        
             1

插上话:我想匹配“”的下一个匹配项,但只打印到它出现的前一行。并且“”出现的行应该是搜索“*SET_PART”的下一个匹配项的行。这是在连续有多个“*SET_PART”段落的情况下。
我使用Gnome版本3.32.2,以防这是相关的。
对于这种情况,有没有比sed更好的工具?
谢谢你的帮忙

vql8enpb

vql8enpb1#

这可能对你有用(GNU sed):

sed -n '/SET_PART/{:a;p;n;/SET_PART/ba;/*/d;ba}' file

这实际上是一个筛选操作,因此使用-n关闭隐式打印。
找到包含SET_PART的行并开始循环。
打印当前行,然后用下一行替换它。
如果该行包含SET_PART,则重新启动循环。
如果该行包含*,则删除它并有效地结束循环。
否则重复该循环。

相关问题