変数を使用してvim正規表現を置き換える方法

変数を使用してvim正規表現を置き換える方法

次の形式の複数行を含む大きなファイルがあります。

USet07-1
USet07-2
USet08-1
USet08-2
.
.
.
USet22-2
.
.
.

-.NETのこれらの文字列からハイフン/ダッシュを削除したいと思いますvim。以下を使用して文字列を検索します。

:/USet\d\d-\d

しかし、これを次に変えようとすると

:%s/Uset\d\d-\d/USet\d\d\d

はっきり理解しています

USetddd

すべての場合に。しかし、私が望むものは:

USet071
USet072
USet081
USet082
.
.
.
USet222
.
.
.

これはどのように達成できますか?一致文字列の一部を再利用して置換に使用できますか?

答え1

はい、可能です。キャプチャグループ。デフォルトでは、パターンのさまざまな部分を次にラップし、\(...\)置換部分の次の部分を参照します\1

:%s/Uset\(\d\d\)-\(\d\)/USet\1\2

欲しいから削除するパターンの単一部分として、\zs(一致の開始)と\ze(一致の終了)を介して実際の一致を制限するより短いオプションがあります(まだ周囲の項目もあると主張しています)。

:%s/Uset\d\d\zs-\ze\d//

これは非常に基本的なものであり、キャプチャグループはsed多くの正規表現ベースのツールで一般的です(たとえば、コマンドを見つけて組み込みをナビゲートする方法を学びます。包括的で多くの:helpヒントを提供します。学習に専念すれば、Vimは非常に強力で効率的なエディタであることが証明されます。

答え2

vim助けてくれてありがとう。部分文字列マッチングを使用して直接ソリューションを見つけました。

:%s/\(USet\d\d\)-\(\d\)/\1\2/gc

答え3

Using sed command

sed "/^USet/s/-//" filename >outputfile

Suppose if you want to perform on orginal file

sed -i "/^USet/s/-//" filename

出力

USet071
USet072
USet081
USet082

awkコマンド

awk '/^USe/{sub("-","",$0);print }' filename >outfile

output

USet071
USet072
USet081
USet082

答え4

\vパターンプレフィックスを使用すると、正規表現をより簡単に使用できます。これにより逃げる必要はありません({[

:%s/\vUSet(\d\d)-(\d)/USet\1\2/

関連情報