次のファイルがあります。
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
一致する最初の行(つまり、含む)から最後の行()まで、すべての行で代替コマンドを実行します。optype
optype
$
同様の行が存在する場合、その行--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
--DELETE
ostype ?
これにより、各「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
ファイルを上書きできます。