正規表現を使用して一部の部分文字列を維持しながらバッチで名前を変更する

正規表現を使用して一部の部分文字列を維持しながらバッチで名前を変更する

この質問をする前に、私は多くの調査を行いました。次のような正規表現を使用してバッチ名前変更を行うためのさまざまなリンクを見つけました。

*パターンベースのターミナルでのバッチファイル名変更

私の問題は、正規表現を使用してバッチ名前変更を実行したいのですが、コードが機能しないことです。

フォルダー内には次のような名前の異なるファイルがあります:

name_house_1_door.jpg
name_house_2_door.jpg
name_house_3_door.jpg
name_house_4_door.jpg

そして、次のようにファイルの名前を変更したいと思います。

name_house_1.jpg
name_house_2.jpg
name_house_3.jpg
name_house_4.jpg

私が求めているものに最も近いコードは次のとおりです。

$  rename -v 's/house\_[0-9]\_door/house_[0-9]/'

しかし、ご存知のとおり、最初のファイルの名前は次のように変更されました: name_house_[0-9].jpg

答え1

もっと簡単な方法は、名前変更を使用して削除することです_door

rename -v 's/_door//' *

これは、何も検索_doorせずに置き換え、基本的に削除します。

答え2

  1. 式の検索側でアンダースコアをエスケープしていますが、そうすべきではありません。
  2. サブ検索 (数字) と、サブ検索の結果を保存して使用するためのプレースホルダーが必要です。

[0-9] の周囲に括弧を追加すると、必要なサブ検索が作成されます。これは最初のサブ検索なので、置換側では $1 として参照できます。結果は次のとおりです。

rename -v 's/house_([0-9])\_door/house_$1/' *

お役に立てれば。

答え3

使用する必要がある後方参照文字クラスは置換式では何も意味しません。実際、置換式では特別な意味を持つ文字はほとんどありません。次のようなものだと思います。

rename -v 's/house_([0-9])_door/house_$1/'

(または)

rename -v 's/(house_[0-9])_door/$1/'

また、-n実際に名前の変更を実行する前に、フラグを使用してどのような名前の変更が行われるかを確認してください。

答え4

これは魚の殻で機能します

for file in *.jpg;  
    mv -n $file (basename $file _door.jpg).jpg; 
end

関連情報