sed只在第一次匹配后插入文本行&仅使用sed在第二次匹配后删除n行

时间:2018-06-14 21:12:42

标签: bash sed insert

对于第一个问题,例如,

A  
B  
C  
B  
D  

需要在B FIRST MATCH 之后插入E.

A  
B  
E  
C  
B  
D  

对于第二个问题的例子,

A  
B  
C  
B  
D  
E  
F  

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

A  
B  
C  
B  
F 

2 个答案:

答案 0 :(得分:1)

这可能适合你(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

在第二个解决方案中:

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

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

N.B。可以使用范围缩短第一个解决方案:

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

或不允许GNU扩展(0,address

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

答案 1 :(得分:0)

使用

完成实施
sed --version
sed (GNU sed) 4.2.2

<强> Q1:

$ 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

<强> Q2:

$ 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