この正規表現のオネライナーを改善する方法はありますか?

この正規表現のオネライナーを改善する方法はありますか?

次の構文を使用するビデオファイルがたくさんあります。

TV.Show.Title.SXEY.Episode.Title.1080p.Uploader.mkv

これはSXEY定数ではありません。ファイルによって異なりますXY名前を次に変更したいです。

TV Show Title - SXEY - Episode Title.mkv

これを行うには、rename次のコマンドを使用します。

rename 's/\./\ -\ /;s/\./\ -\ /;s/\.(?!mkv)/\ /g;s/1080p.*(?=\.mkv)//g' *.mkv

このコマンドは最初に最初の2つの点をに変換し、他のすべての␣-␣点を空白に変換し、最後にエピソードのタイトルの終わりとファイル拡張子の間のすべての内容を削除します。

これがどのように改善されるのか、どのようなアイデアがありますか?正規表現を使って最初の2点を変換する方法があると思います。私はrenameそれがGNUユーティリティであると信じているので、すべてのUnixシステムには存在せず、より移植可能な代替策を探しています。

答え1

この質問は実際にそれに関するものであり幸いですregex。同じ質問をして頭が痛くならないようにしたいです。

for m in *.mkv; 
    do echo mv $m "$(awk -F'.' '{
        printf "%s %s %s - %s - %s %s.%s", $1, $2, $3, $4, $5, $6, $(NF)}' <<<$m)";
done

出力文字列は予測可能で読みやすく、修正が容易です。ただ削除してくださいecho

編集する

以下のコメントに関してsed同じ技術を使用し、代わりに出力用のファイル名を処理できますsedawk

for m in *.mkv; 
    do echo mv $m "$(sed 's/\./ /1;s/\./ /1;s/\./ - /1;s/\./ - /1;s/\./ /1;s/\..*\././' <<<$m)";
done

答え2

次のことができます。

$ rename -n 's/.(S\d+E\d+)./ - $1 - /; s/\./ /g; s/\.1080p.+\././' *mkv
TV.Show.Title.SXEY.Episode.Title.1080p.Uploader.mkv -> TV Show Title - SXEY - Episode Title 1080p Uploader mkv

または、次のようなものかもしれません。

$ rename -n 's/1080p.*\.//; s/\.(?!mkv)/ /g; s/S\d+E\d+/- $& -/' *mkv
TV.Show.Title.SXEY.Episode.Title.1080p.Uploader.mkv -> TV Show Title - SXEY - Episode Title.mkv

スペースを脱出する理由がないことに注意してください。したがって、正規表現ロジックで実際に何も変更せずにコマンドを単純化できます。

rename 's/\./ - /;s/\./ - /;s/\.(?!mkv)/ /g;s/1080p.*(?=.mkv)//g' *.mkv

.mkvただし、これにより不要な項目の前にスペースが追加されます(元のバージョンでもこれが行われます)。おそらくこれは:

rename -n 's/\./\ -\ /;s/\./\ -\ /;s/\.(?!mkv)/\ /g;s/ 1080p.*(?=.mkv)//g' *.mkv

より移植性の高いソリューションが必要な場合は、次のものを使用できますperl(perlはほとんどすべての* nixシステムでは使用できませんが)。

perl -e 'for (@ARGV){$n=$_;s/1080p.*\.//;s/\.(?!mkv)/ /g;s/S\d+E\d+/- $& -/; rename($n,$_)}' *mkv

移植性を最大化するには、シェルですべての操作を行います(少しsed)。

for f in *mkv; do 
    k=${f//./ }
    k=$( printf '%s' "$k" | sed 's/S\([0-9][0-9]*E[0-9][0-9]\)/ - \1 -/')
    k=${k/ 1080p*/.mkv}
    mv -- "$f" "$k"
done

重要なヒント:あなたがやろうとしていることはとても悪い考えです。ファイル名にスペースが含まれていると、操作がより難しくなり、後でそのファイルに対して実行したいすべての種類のタスクがより困難になります。もう一度考えてみてください。

答え3

努力する:

rename -v -n \
  's/\./ /g;s/S[X0-9]*E[Y0-9]*/- $& -/;s/ \d*p .* mkv$/.mkv/' *.mkv

出力は何が起こるかを示すテスト実行を提供しますが、ファイルはまだ移動されていません。

rename(TV.Show.Title.SXEY.Episode.Title.1080p.Uploader.mkv, 
       TV Show Title - SXEY - Episode Title.mkv)

出力が良く見える場合は、-v -nmidから削除してください。sデリゲート私のものになるアドホック可能性の低いデモ文字列を処理する方法「SXEY」、(変更する《S02E23》またはその他)次に変更してくださいs/S\d*E\d*/- $& -/

rename 's/\./ /g;s/S\d*E\d*/- $& -/;s/ \d*p .* mkv$/.mkv/' *.mkv

メモ:

  • \一重引用符 ""を使用する場合は、 ""などのスペースをエスケープする必要はありません' '

  • 上記のコードは.すべてのsを空白に置き換えて、次のものを探します。Sイ・サンチャン/第二piode文字列を削除してから、最後のファイル拡張子を復元します.mkv。これにより、固定長のエピソードや番組のタイトルは不要になります。

答え4

ユーティリティがグループキャプチャをサポートしているかどうかはわかりませんが、それを使用することは実行可能な戦略になります。

([^.]+)[.]([^.]+)[.]([^.]+)[.]([^.]+)[.]([^.]+)[.]([^.]+)[.]([^.]+)[.]([^.]+)[.]([^.]+)

それからあなたは使うでしょう

$1 $2 $3 - $4 - $5 $6.$7

この戦略の利点は、実際には異なる命名スキームの意味を解決し、フィールドの順序を変更または省略できることです。可能であれば、文字グループを使用して文字をエスケープすることをお勧めします。[.]\.

関連情報