私はこの質問を見ていて、純粋に
 POSIX
 を使用sedする私の答えを
どのように実装できるのか疑問に思いました。ex
秘訣はsed、ホールドスペースとパターンスペースを比較して(とG;/^\(.*\)\n\1$/{do something})が完全に等しいかどうかを確認することは
 できますが、ではそのようなテストを行う方法がないことですex。
Vim Yでは、最初の行をアンクしてから入力
 :2,$g/<C-r>0/dして、指定したことをほぼ実行できます。ただし、最初の行に非常に単純な英数字のテキスト以外が含まれている場合、行は正規表現としてダンプされるので、これは実際に不自然になります。
 、比較のための単なる文字列ではありません。(最初の行にスラッシュが含まれている場合、行の残りの部分はコマンドとして解釈されます!)
したがってmyfile、最初の行と同じであるすべての行を削除したい場合(ただし、最初の行は削除しない場合)は、どのように使用できexますか?それについて、私はそれをどのように使用できviますか?
別の行と完全に一致する行を削除するPOSIXの方法はありますか?
おそらくこの架空の構文のようなもの:
:2,$g/**lines equal to "0**/d
sedとして使用し、バッファー全体で私の回答全体を実行することです... もちろん、これは機能します(実際にはとは異なり、移植可能です)。exsedsed -i
                <C-r>0非常に良いと思う。特殊文字を保護する必要があるため、Exコマンドのみでより良い結果が得られるかどうかはわかりません。POSIX準拠の制約なしでは、非常にnomagicスイッチ\Vを使用し、2番目の引数がエスケープ/保護するすべての文字を含む文字列\Vであるescape()関数を使用して、バックスラッシュを保護します(これはでも特別な意味を保持するため)。 。
                :execute '2,$g/\V' . escape(getline(1), '\/') . '/d'または、セミコロンのようなパターン区切り文字に別の文字を使用できます。この場合、パターンのスラッシュを保護する必要はありません。次のような結果になります:execute '2,$g;\V' . escape(getline(1), '\') . ';d'
                sedも非常に良いと思います。Vimでは、特定の特別なタスクを他のプログラムに委任することがよくありますが、これsedはおそらくその良い例です。ちなみに、sedバッファ全体で実行する必要はありません。バッファの一部でのみ実行する場合は、範囲を指定できます。たとえば、50から100までの行のみをフィルタリングする場合は、次のように入力します:50,100!<your sed command>。
                
:execute '2,$g/\V' . escape(getline(1), '\') . '/d'