9

音楽をクリーンアップするための Bash スクリプトを作成しています。

すべてのファイル名をフォーマットして作成したかったので、インターネットで少し検索して、次の行を書きました。

sed -i -e 's/[-_]/ /g' -e 's/ \+/ /g' -e **'s/\<[a-z]/\U&/g'** -e "s/$artist //g" -e "s/$album //g"

ファイル名をテキストファイルに追加してからsedしていましたが、新しい名前をファイルに適用する方法がわかりませんでした。

そこで、名前の変更を試してみたところ、単語の最初の文字をすべて大文字にするはずの太字の部分を除いて、まったく同じ結果が得られました。

rename 's/[-_]/ /g' * && rename 's/\s+/ /g' * && **rename 's/\s\w{1}/*A-Z*/g' *** && rename 's/^\d+[[:punct:]]\s//g' * && rename "s/$artist\s//g" * && rename "s/$album\s//g" * && rename "s/($ext)//g" *

現在、rename のコードは (少なくとも十分に) 機能しており、スペース文字の後に 1 文字しか検出されていませんが、問題があるのは置換です。私は数多くの異なるアプローチを試みましたが、この場合、フォーカスされた最初の文字が正確に AZ に交換されるという結果になりました。

名前の変更のマニュアル ページでは、's/az/AZ/g' を実行すると小文字を大文字にするように書かれていますが、az AZ が見つかった場合にのみ適用されることは容易に理解できます。だから、これは私が助けを必要としているものです。

ボーナスは、誰かが sed の例のようにそれを行う方法を知っている場合です。\< は各単語の先頭に一致します。現時点では、私の名前変更コマンドは最初の単語には適用されず、どちらも適用されないためです。明らかな理由で、「ディスク名 [ディスク 1]」のようなディスクが複数ある場合。

4

2 に答える 2

15

renameこれは、Perlで書かれており、名前の変更を実行する方法の説明は Perl コマンドであるため、一種の Perl に関する質問です。

s///置換が大文字バージョンを挿入する文字を知るためには、入力から文字を「キャプチャ」する必要があります。パターン内の括弧がこれを行い、キャプチャされた文字を変数に格納します$1。そして\u置換では、次の文字を大文字にします。

したがって、次のことができます。

$ rename 's/\s(\w)/ \u$1/g' *

パターンにはスペースが含まれており、スペースと元の文字の両方が置き換えられるため、置換部分では大文字の前にスペースを挿入する必要があることに注意してください。\bこれは、単語境界でのみ一致するゼロ幅アサーションを使用することで回避できます。

$ rename 's/\b(\w)/\u$1/g' *

また、 (正規表現の他の記号と同様に)デフォルトで単一の文字に一致する{1}ため、そこには必要ありません。\w

最後に、rename(1)の例は、実際にはではなく、演算子y/A-Z/a-z/を使用したです。は完全に異なる演算子であり、ある文字セットのすべての発生を別の文字セットに置き換えます。大文字にしたいのは一部の文字だけなので、ここでは役に立ちません。y///s///y///

于 2013-01-09T16:52:04.243 に答える
3
rename -nv 's{ (\A|\s) (\w+) }{$1\u$2}xmsg'

これにより、文字列の先頭\Aまたは空白の\s後に少なくとも1つ以上の単語文字(az、0〜9、アンダースコア)が続きます\w+。すべての単語シーケンスの最初の文字を大文字にします。

于 2013-01-09T16:46:55.110 に答える