名前変更を使用して、検索正規表現の一部を維持する


8

朝、

私が取り組む必要がある現在のプロジェクトには、私を悩ませた以前の命名方式がありました...

Base.v2.c
Base.v2a.c
Slider.v4a.h
Area.v2a.2.h

バージョンの "a"は、より多くの作業が必要な "alpha"バージョンを識別することであると言われました。プロジェクトのこの段階で、「a」を削除して「.1」に置き換えることができます(v2a-> v2.1)。

私が手動でやろうと思っている以上に、たくさんのファイルがあります。

renameコマンドを使用してすべてのファイルの名前を一度に変更できることはわかっていますが、その方法で問題が発生しています。私が次のようなものを使用した場合:

rename 's/[0-9]a/.1/' *

その後、バージョン番号の最後の桁が失われます。ファイルの検索に使用された正規表現の一部を名前変更(または別のコマンドラインツール)に記憶させる方法はありますか?したがって、「[0-9] a」から「[0-9] .1」に変更すると、1aが1.1に、4aが4.1に変更されます。


それは悪い考えです。通常v2a < v2 < 2.1。つまり、バージョン2のアルファは、バージョン2の前のバージョンを表し、それ以降のバージョンを表していません。名前をversion 1.99などに変更することをお勧めします。
jpaugh、

回答:


15

キャプチャグループを使用できます。

$ rename -n 's/(\d)a/$1.1/' *
Area.v2a.2.h -> Area.v2.1.2.h
Base.v2a.c -> Base.v2.1.c
Slider.v4a.h -> Slider.v4.1.h

または、後読みを使用できます。

$ rename -n 's/(?<=\d)a/.1/' *
Area.v2a.2.h -> Area.v2.1.2.h
Base.v2a.c -> Base.v2.1.c
Slider.v4a.h -> Slider.v4.1.h

または、後読みのように、長さが0のアサーションで\K、「この時点まですべての一致を忘れる」ことを意味します。

$ rename -n 's/\d\Ka/.1/' *
Area.v2a.2.h -> Area.v2.1.2.h
Base.v2a.c -> Base.v2.1.c
Slider.v4a.h -> Slider.v4.1.h

\d代わりに短い方を使用したことに注意してください[0-9]。2つは同等renameですが、perlスクリプトであるため、Perl互換正規表現(PCRE)の構文を理解しています。

これは、最初に出現する数値とそれに続くのみを変更することに注意してくださいa。これは、ファイル名に応じて、必要な場合とそうでない場合があります。

-nなりますがrename、それは実際には何もせずにどうなるのかを示しています。期待どおりに動作することを確認したら、削除して実際にファイル名を変更します。


8

このようにコマンドを変更します。

rename 's/([0-9])a/$1.1/' *
  • 置換コマンドs/<souce>/<replacement>/は、ソース文字列(正規表現の場合もある)を置換文字列に置き換えます。
  • 捕獲基-括弧で囲まれているソース文字列の部分は:(regexp)(string)、等の連続変数の値として割り当てられます。$1$2など。
  • したがって、置換文字列内では、変数$1はその値で展開されます[0-9]。この場合、変数はregexpと一致する必要があります。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.