Awk 使用sed删除两个字符之间的内容,但如果该字符再次出现,则直到该字符结束

Awk 使用sed删除两个字符之间的内容,但如果该字符再次出现,则直到该字符结束,awk,sed,grep,Awk,Sed,Grep,示例一:我想保留“W” 文件:input.txt 内容: ab ab ab z ab z ab W ab z ab 命令: sed 's/ab.*ab/~/g' input.txt sed 's/<.*>/~/g' input.txt 结果: ab ~ z ~ ~ ~ ~ blob2 < 目标: 例二: 目标:保持blob 文件:input.txt 内容: <\ab> <\!DOCTYPE html> blob <> <\!

示例一:我想保留“W”
文件:
input.txt

内容:

ab
ab ab z
ab z ab W ab z ab
命令:

sed 's/ab.*ab/~/g' input.txt
sed 's/<.*>/~/g' input.txt
结果:

ab
~ z
~
~
~
~ blob2  <
目标:

例二: 目标:保持blob
文件:
input.txt

内容:

<\ab>
<\!DOCTYPE html> blob <>
<\!DOCTYPE html> blob <> blob2  <

斑点
水滴水滴2<
命令:

sed 's/ab.*ab/~/g' input.txt
sed 's/<.*>/~/g' input.txt
sed's/~/g'input.txt
结果:

ab
~ z
~
~
~
~ blob2  <
~
~
~blob2<
目标:

~
~blob~
~blob~ blob2<
不幸的是,只有blob2幸存下来。帮我救一个

看起来
sed
将找到“”的第一个实例并删除介于两者之间的内容。我正在尝试让sed在'>'的下一个实例(而不是最后一个)之间进行替换。

这可能适合您(GNU sed):

首先以例二为例:

sed 's/<[^>]*>/~/g' file
如果一行不包含两个或两个以上的
ab
。否则,将所有
ab
替换为唯一字符,例如
\n
,并使用与示例II相同的技巧,将
\n[^\n]*\n
替换为
~
。但是,可能会有奇数个
ab
,因此请用其原始值替换此类事件。

有关如何清晰地格式化代码和示例输入/输出块的信息,请参见。