我有一个这样的文件:
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
如何通过awk
or来实现这一点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
覆盖原始文件。