要件は次のとおりです:
入力ファイルinput.txt:
a1
a2
a3
a4
b1
b2
a5
b3
b4
b5
必要な出力ファイルoutput.txtは次のとおりです:
a1
a4
b1
b2
a5
b3
b5
つまり、N 番目の行を削除します。N が満たす条件は、N 番目の行と N-1 行と N+1 行の最初の文字が同じです (最初と最後の行は削除されません)。
この要件を達成するために、vi の代替コマンドまたはシェルを使用できますか? いくつかのヒントも欲しいです。ありがとうございます。 (私は C++ を使用して実装しましたが、正規表現を使用して実装できるかどうかを知りたいだけです)
黄舟2017-05-16 16:44:06
((.).*n)
最初の行と一致し、外側のグループ化は置換時の後方参照に使用され、内側のグループ化はその後の判断に使用されます
((2.*n)+)
前の行の最初の文字で始まる次の行と一致します (1 行以上)
(2.*$)
最初の行の最初の文字で始まる行と一致します
最後の 15 行は、上で一致したすべての行を最初と最後の行に置き換えます。つまり、中央の行を削除します
注: 最初の v は Perl の通常モードに切り替えるためのもので、括弧とプラス記号をエスケープする必要はありません
ところで、この種のテキスト処理作業を完了するには、Perl スクリプトを使用するのが最も便利です。vi の利点は視覚的なデバッグですが、大きなファイルに遭遇した場合は GG になります。