異なる行のパターン発生に基づいて行のコメントを削除します。

異なる行のパターン発生に基づいて行のコメントを削除します。

次のファイルがあります。

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これを達成する方法は何ですかsed

答え1

そしてsed

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

正規表現にs一致する最初の行(つまり、含む)から最後の行()まで、すべての行で代替コマンドを実行します。optypeoptype$

同様の行が存在する場合、その行--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 ?このGNUを使用できます。sed

$ 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

--DELETEostype ?これにより、各「ostype」の後に表示されるコメントの数に関係なく、各発生後のコメントが削除されます。

答え3

パール方法:

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ファイルを上書きできます。

関連情報