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と一致しませんが、.これはあなたの例に現れます。
  • .最後のエンディング(例:)から外れる方法はありません\.。これはすべての文字と一致します。
  • 部品の交換には重複はありません。テキストを追加するのではなく、効果的に削除できます。

答え2

.tar.gz が常に削除される場合:

%s/^\(.*\).tar.gz/\1 \1.tar.gz/g

答え3

ファイル名: testt

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

注文する

sed "s/[a-z]\{3\}\.\{0,1\}-\{0,2\}\.\{0,1\}[0-9]\{0,1\}\.\{0,1\}[0-9]\{0,1\}/& &/" test| sed "/[a-z]\{3\}\. /s/\.//1"

出力

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

答え4

必ずそうでしょうかvi

それ以外の場合は、必要に応じて実行できます(GNUを使用xargs)。

cat foo.txt | xargs -i basename {} .tar.gz | xargs -i echo {} {}.tar.gz

foo.txtファイルはどこにありますか?

直す。

$ cat foo.txt
abc.tar.gz
abc.1.1.tar.gz
bca-1.2.tar.gz


$ cat foo.txt | xargs -i basename {} .tar.gz | xargs -i echo {} {}.tar.gz
abc abc.tar.gz
abc.1.1 abc.1.1.tar.gz
bca-1.2 bca-1.2.tar.gz

上記の内容を理解できませんでしたか?

関連情報