私はこの質問を見ていて、純粋に
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
として使用し、バッファー全体で私の回答全体を実行することです... もちろん、これは機能します(実際にはとは異なり、移植可能です)。ex
sed
sed -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'