私はcygwinで名前変更ツールのPerlの実装で遊んで、ついにcpanからインストールして動作させました。
私は長い間これをやっていなかったので、正規表現に少し錆びました。
基本的にフォームフォルダの名前を変更したいと思います。
[2022-10-10] This is a Test - This is a Test (some stuff) [393933939339]
または
[2022] This is a Test - This is a Test (some stuff) [393933939339]
内容を最初[]
から最後まで移動して、次のように見せます。
This is a Test - This is a Test (some stuff) [393933939339] [2022-10-10]
または
This is a Test - This is a Test (some stuff) [393933939339] [2022]
位置パラメータを使用してこれを行う方法を見つけましたが、パターンマッチングを使用して実行するのに問題があります。[]
rename -n 's/^(.{12})(.*)$/$2 $1/'
これは、日付全体を含むフォルダに対しては実行されますが、年のみを含むフォルダでは実行されません。理想的には、これらすべてを処理する1つの表現が欲しいです。
[ ] が演算子と見なされ、何らかの方法でエスケープする必要がある可能性があるため、これは複雑になる可能性があると思います。
助けてくれてありがとう。
答え1
[ ] が演算子と見なされ、何らかの方法でエスケープする必要がある可能性があるため、これは複雑になる可能性があると思います。
まさに。 REで文字をエスケープする標準的な方法は、文字の前にバックスラッシュを付けることです\
。だから、
rename -n 's/^(\[.*?])\s*(.*)/$2 $1/s' '['*
しました尊敬されるパターン置換の末尾修飾子を含める必要がありますs
。これは、パターンが改行文字を文字に一致させることができるためです(最終的にはファイル名では有効です)。または、asファイル名パターンを使用して、変換できるファイルセットと見なされるファイルセットを制限します(これは、-v
シェルによって渡され、有効な引数オプションとして処理されるなどで始まるファイル名を無視します)。rename
'['*
./*
答え2
私は何をしますか:
$ rename -n 's/^(\[.*?\])(.*)/$2 $1/' *393933939339*
rename([2022] This is a Test - This is a Test (some stuff) [393933939339], This is a Test - This is a Test (some stuff) [393933939339] [2022])
正規表現の一致は次のとおりです。
節 | 説明する |
---|---|
^ |
ストリングアンカーの始まり |
( |
\1 にグループ化してキャプチャ: |
\[ |
[ |
.*? |
\nを除くすべての文字(0回以上(できるだけ少なく一致)) |
\] |
] |
) |
\1 終了 |
( |
\2 にグループ化してキャプチャ: |
.* |
\nを除くすべての文字(0回以上(最大一致)) |
) |
\2 終わり |