複数の正規表現を有効な1行に圧縮することはできません。私のファイル名は次のとおりです。Something (0482) - a123b456 - Something [00xcf bxc v32 Something]
結果をsomething-a123b456-Something
次のように指定したいと思います。something_-_a123b456_-_Something
圧縮したい正規表現は次のとおりです。
's/(^.*)/\L\1/' # makes the whole string lowercase
's/\(.*?\)|_//gs' # removes everything between parentheses
's/\[.*?\]|_//gs' # removes everything between square brackets
's/ /_/g' # substitutes whitespaces with underscores
手動で、または以下を使用してコマンドを一緒に接続してみました。このウェブサイトしかし、正規表現は次のようになります。いいえ私の強み。誰が教えてくれたら本当にありがとう。どのように1つは、複数のコマンドをまとめて次に直接実行できるようにすることです。
prename
ちなみに私は(Perl)を使っています。
答え1
一般に、Perl式は、暗黙の変数に対して機能するスタイルの連結を達成するために;
soで連結されます。この内容をどこで入手するのか分からないので、次のようにします。s/.../foo/;s/.../bar/;...
rename
$_
prename
私自身のバージョンここにrename
。たぶんあなたと非常に似ているかもしれません。この-p
フラグは、プレビューやファイルシステムの破損を防ぐために使用されます。
$ touch 'Something (0482) - a123b456 - Something [00xcf bxc v32 Something].demo'
$ rename -p 's/(^.*)/\L\1/;s/\(.*?\)|_//gs;s/\[.*?\]|_//gs;s/ /_/g' *.demo
rename Something (0482) - a123b456 - Something [00xcf bxc v32 Something].demo something__-_a123b456_-_something_.demo
しかし、これはおそらく改善されるかもしれません。ここでは、すべてに正規表現を使用する理由はありません。
$ rename -p '$_=lc; s/\(.*?\)|_//gs;s/\[.*?\]|_//gs; tr/ /_/' *.demo
rename Something (0482) - a123b456 - Something [00xcf bxc v32 Something].demo something__-_a123b456_-_something_.demo
したがって、$_=lc
すべての内容を小文字に$_
変更します。それとも、連続した空白を1つの下線に置き換える必要がありますか?もしそうなら、 。バランス調整式の正しい一致はより複雑になりますが、それでも改善することができます。s/ /_/
tr
s/\s+/_/g
()
[]
さらなる研究にはあまり意味がありません。表情を交互にして殺さずに(繰り返し!)キャラクターをs/\(.*?\)|_//gs
殺すより良い方法があります。_
()
[]
$ rename -p '$_=lc; tr/_//; s/\(.*?\)//gs;s/\[.*?\]//gs; tr/ /_/' *.demo
rename Something (0482) - a123b456 - Something [00xcf bxc v32 Something].demo something__-_a123b456_-_something_.demo
「終了文字ではなく文字のみ一致」などを使用して効率を得ることもできますが、効率より読みやすくしたい場合があります.*?
。s/\([^)]*\)//gs
ただし、1行のコードで正規表現を使用すると、読みやすさ予算を超えることになります。
$ rename -p '$_=lc; tr/_//; s/\([^)]*\)//g; s/\[[^\]]*\]//g; tr/ /_/' *.demo
rename Something (0482) - a123b456 - Something [00xcf bxc v32 Something].demo something__-_a123b456_-_something_.demo