次の形式の複数行を含む大きなファイルがあります。
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/