viエディタで置き換え

viエディタで置き換え

というファイルがありますfoo.txt。このファイルには次の値が含まれています。

abc.tar.gz
abc.1.1.tar.gz
bca-1.2.tar.gz

私はこのような出力を得たい

abc abc.tar.gz
abc.1.1 abc.1.1.tar.gz
bca-1.2 bca-1.2.tar.gz

同じ値/テキストが元の値/テキストの前に表示される必要があります。正規表現を使用してどのようにこれを達成できますか?

%s/^[a-z_-]*./\1/g

上記の表現を使用しましたが、出力が間違っています。

ベストアンサー1

キャプチャグループ:help /\(パターンに一致する項目を内部に保存できます。その後、\(...\)代替アイテム(または後でパターン自体)で一致を参照できます(\1最初のグループ\2などを介して)。

問題を解決する1つの方法(いくつかあります)は、.tar.gz拡張子の前にファイル名をキャプチャすることです。置換には、キャプチャ(\1)、スペース、元のテキスト(\0、、または&)を配置します。

:%substitute/\(.*\)\.tar\.gz$/\1 &/

または、拡張子の前にあるものを一致させて(一致終了のために\ze)コピーすることもできます。

:%substitute/.*\ze\.tar\.gz$/& &/

試みに問題があります。

  • 逆参照を使用しましたが、\1何もキャプチャしませんでした。
  • [a-z_-]literalと一致しませんが、.これはあなたの例に現れます。
  • .最後のエンディング(例:)から外れる方法はありません\.。これはすべての文字と一致します。
  • 部品の交換には重複はありません。テキストを追加するのではなく、効果的に削除できます。

おすすめ記事