web-dev-qa-db-ja.com

sedまたはperlにvimの\ zsに相当するものはありますか?

Vimでは、\zs atomを使用して、「本当にここから試合を開始する」と言うことができます。

:%s/funnyword\zs.*$/otherword/

Sedまたはperlに相当するものはありますか?

11
ninrod

Perl(およびPCRE)では、これは ゼロ幅ルックビハインド で実現可能です。

(?<=funnyword).*$

これは「funnyword」と一致しますが、一致の一部としては消費しません。これらは、後読みの固定長テキストでのみ機能します。ネガティブルックビハインド((?<!...))を使用して、一部のテキストが存在しないことを指定することもできます。

かなり最近のバージョンのPerlでは、 \Kは、使用している\zs のほぼ正確な代替です。

funnyword\K.*$

\Kは、これまでに一致したものをすべて破棄しますが、その時点から引き続き一致します。 \Kの前の部分は固定長である必要はありません。これは 現在PCREでも ですが、どのバージョンで提供されたかはわかりません。

\zeは、代わりに(?=...)を使用して、幅ゼロの先読みで実現できます。そのパターンは固定長である必要はありません


Sedは POSIX BRE を使用するため、 ルックアラウンドはありません 。ただし、この場合、通常のキャプチャグループを使用してかなり簡単にシミュレートできます。

sed -e 's/\(funnyword\).*$/\1otherword/'

ポジティブな先読みについても同じことができます。本当にもっと複雑な要件がある場合は、Perlまたは他のアプローチに目を向ける必要があるかもしれません。

15
Michael Homer