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

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

我有一个这样的文件:

File1:

json ABC
optype D
json XYZ
json IJK
--DELETE OP_TYPE 
json IJK

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

期望的输出:

json ABC
optype D
json XYZ
json IJK
DELETE OP_TYPE 
json IJK

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

File2:

json ABC
json XYZ
json IJK
--DELETE OP_TYPE 
json IJK    

期望的输出:

json ABC
json XYZ
json IJK
--DELETE OP_TYPE     
json IJK

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

答案1

sed

sed '/optype/,$ s/^--\(DELETE\)/\1/'

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

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

等价perl的:

perl -pe 's/^--(?=DELETE)// if /optype/..0'

或者awk

awk '/optype/, 0 {sub("^--DELETE", "DELETE")}; {print}'

答案2

假设你想--DELETE...在 发生后操作每一个optype ?,你可以使用这个 GNU sed

$ sed -E '/^optype/{:a;n;s/^--(DELETE)/\1/;ba}' input_file

这将编辑--DELETE...以 开头的任何行之后的每次出现ostype ?,如果这不是预期的行为并且您只想编辑之后的第一次出现,那么ostype ?您可以使用此 GNUsed

$ sed -E '/^optype/{:a;t;n;s/^--(DELETE)/\1/;ba}' input_file
json ABC
optype D
json XYZ
json IJK
DELETE OP_TYPE 
json IJK

--DELETE这将在每次出现后删除注释ostype ?,无论每个“ostype”之后出现的注释数量如何

答案3

Perl 方法:

perl -pe '$k++ if /optype/; s/^--(?=DELETE)// if $k' file2

如果某行匹配,我们就增加变量的值optype,然后如果设置了该变量,--则从以该行开头的任何行中删除 。--DELETE?=构造是一个积极的前瞻

答案4

像这样?

第一的操作类型:

$ cat File1 
json ABC
optype D
json XYZ
json IJK
--DELETE OP_TYPE 
json IJK
$ awk 'BEGIN{unco=0}{if($0~/optype/){unco=1};if(unco){gsub(/^--/,"")}; print }' File1 
json ABC
optype D
json XYZ
json IJK
DELETE OP_TYPE 
json IJK

然后没有:

$ cat File1 
json ABC
ptype D
json XYZ
json IJK
--DELETE OP_TYPE 
json IJK
$ awk 'BEGIN{unco=0}{if($0~/optype/){unco=1};if(unco){gsub(/^--/,"")}; print }' File1 
json ABC
ptype D
json XYZ
json IJK
--DELETE OP_TYPE 
json IJK

unco如果一行包含 ,我们设置一个标志optype

如果设置了该标志,我们将修剪掉--任何后续行。

我们打印每一行。

如果您使用,GNU awk则可以利用内联函数就地修改文件;否则重定向到 tmp 文件并mv覆盖原始文件。

相关内容