根据模式在另一行中的出现取消注释一行

Tex*_*xGC 1 sed awk text-processing

我有一个这样的文件:

File1:

json ABC
optype D
json XYZ
json IJK
--DELETE OP_TYPE 
json IJK
Run Code Online (Sandbox Code Playgroud)

如果上面任何地方都有模式 optype,我想取消注释以 DELETE 开头的行。

期望的输出:

json ABC
optype D
json XYZ
json IJK
DELETE OP_TYPE 
json IJK
Run Code Online (Sandbox Code Playgroud)

如果文件没有上面的模式 optype,则不需要修改。

File2:

json ABC
json XYZ
json IJK
--DELETE OP_TYPE 
json IJK    
Run Code Online (Sandbox Code Playgroud)

期望的输出:

json ABC
json XYZ
json IJK
--DELETE OP_TYPE     
json IJK
Run Code Online (Sandbox Code Playgroud)

如何通过awkor来实现这一点sed

Sté*_*las 6

sed

sed '/optype/,$ s/^--\(DELETE\)/\1/'
Run Code Online (Sandbox Code Playgroud)

s它在从第一行匹配正则optype表达式(即包含optype)到最后一行( )的所有行上运行ubstitute 命令$

请注意,如果存在类似的行,--DELETE optype它将被视为范围的开始并且不会被注释。

等价perl的:

perl -pe 's/^--(?=DELETE)// if /optype/..0'
Run Code Online (Sandbox Code Playgroud)

或者awk

awk '/optype/, 0 {sub("^--DELETE", "DELETE")}; {print}'
Run Code Online (Sandbox Code Playgroud)