linux 如何让sed只影响第一个匹配的范围

5hcedyr0  于 2023-05-28  发布在  Linux
关注(0)|答案(2)|浏览(127)

我正在使用这个sed

sed -i "/^### Header$/,/^### [^#]*$/{//!d}"

此sed删除了标题到标题2之间的所有文本。我只想删除第一个匹配范围的文本。
注意我不知道下一个标题的标题是什么!
输入:

### Header

blabla

### Header 2 

some text 

### Header

blabla

### Header 2 

some text 

### Header

blabla

### Header 2 

some text

输出:

### Header
### Header 2 

some text 

### Header

blabla

### Header 2 

some text 

### Header

blabla

### Header 2 

some text
pgx2nnw8

pgx2nnw81#

使用GNU sed

$ sed '/^### Header$/,/^###/{1,/^###/{//!d}}' input_file
### Header
### Header 2

some text

### Header

blabla

### Header 2

some text

### Header

blabla

### Header 2

some text
zpf6vheq

zpf6vheq2#

sed是对简单字符串执行s/old/new/的优秀工具,对于其他任何事情,只需使用awk来实现清晰性,可移植性,健壮性,效率等的某种组合。在这种情况下,在每个Unix机器上的任何shell中使用任何awk:

$ awk '/^### [^#]/{inRange=0} !inRange{print} /^### Header$/ && (++cnt==1){inRange=1}' file
### Header
### Header 2

some text

### Header

blabla

### Header 2

some text

### Header

blabla

### Header 2

some text

请注意,通过使用标志变量inRange,您不必像使用范围运算符(参见Is a /start/,/end/ range expression ever useful in awk?)那样测试范围的开始或结束两次,并且通过使用计数器变量cnt,您可以轻松地更改代码,以在范围的第2次或第10次或任何其他出现的情况下操作,而不是第一次出现或除了第一次出现之外。sed没有变量。

相关问题