【问题标题】:sed to insert a text line after first match only & remove n lines after second match using sed onlysed 仅在第一次匹配后插入文本行并在第二次匹配后删除 n 行仅使用 sed
【发布时间】:2018-11-24 17:38:20
【问题描述】:

对于第一个问题,例如,

A  
B  
C  
B  
D  

需要在BFIRST MATCH之后插入E。

A  
B  
E  
C  
B  
D  

以第二个问题为例,

A  
B  
C  
B  
D  
E  
F  

第二次模​​式匹配后只需要删除 D 和 E,2 行。

A  
B  
C  
B  
F 

【问题讨论】:

  • Insert line after first match using sed 的可能副本尽管它确实有两个问题使它更广泛......也许它仍然可以通过重新聚焦来挽救?也为解决方案付出一些努力永远不会受到伤害。
  • 给新人的建议:如果一个答案解决了您的问题,请点击旁边的大复选标记 (✓) 接受它,也可以选择投票(投票至少需要 15 声望)点)。如果您发现其他答案有帮助,请给他们投票。接受和投票有助于未来的读者。请看【相关帮助中心文章】[1] [1]:stackoverflow.com/help/someone-answers

标签: bash sed insert


【解决方案1】:

完成的实现
sed --version
sed (GNU sed) 4.2.2

第一季度:

$ more input
A
B
C
B
D
B
D

sed:

$ sed -n -e '/^B$/!{p};/^B$/{p;x;/^$/{a E' -e '}}' input
A
B
E
C
B
D
B
D

第二季度:

$ more input2
A
B
C
B
D
E
F

sed:

$ sed -n '/^B$/{p;H};/^B$/!{x;/B\nB1\?$/{s/.*/&1/;x;b;};x;p}' input2
A
B
C
B
F

【讨论】:

    【解决方案2】:

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

    sed -e '/B/!b;x;s/^/x/;/^x\{1\}$/{x;aE' -e 'b};x' file
    
    sed -e '/B/!b;x;s/^/x/;/^x\{2\}$/{x;n;N;d};x' file
    

    这两种解决方案都可以分为三个部分:

    • 专注于特定的正则表达式
    • 计数
    • 以上条件为条件

    如果正则表达式不正确,继续正常

    如果正则表达式为真,则通过在每次出现的保留空间中附加一个字符 (x) 来计算它。

    有条件地对计数(在第一个解决方案中,1 和第二个解决方案中,2)执行一个动作。

    在第一个解决方案中:

    • 附加一行包含E

    在第二种解决方案中:

    • 打印当前行
    • 添加接下来的两行
    • 删除当前模式空间

    如果条件不成立,照常继续。

    注意第一个解决方案可以使用范围缩短:

    sed '0,/B/!b;//aE' file
    

    或者对于不允许 GNU 扩展的 sed 变体 (0,address)

    sed -e '/B/{aE' -e ':a;n;ba}' file
    

    【讨论】:

    • 不错的解决方案!比我的短一点 ;-) +1!
    猜你喜欢
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 2015-05-07
    • 2013-07-02
    • 1970-01-01
    相关资源
    最近更新 更多