如何將多個正則表達式壓縮為單行?
我無法將幾個正則表達式壓縮成一個有效的單行。我有這樣命名的文件名:
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
我試圖將命令連結在一起,無論是手動還是使用這個站點,但正則表達式不是我的強項。如果有人能告訴我如何將多個命令連結在一起,我將非常感激,這樣我下次就可以自己做。
順便說一句,我正在使用
prename
(Perl)。
通常,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
將 中的所有內容小寫$_
,並將 替換s/ /_/
為tr
。或者也許應該用單個下劃線替換空白執行?如果是這樣,s/\s+/_/g
.()
and[]
可能也可以改進,儘管在這種平衡的表達式上正確匹配會變得更加複雜。對額外的研究
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
來匹配 only-that-which-is-not-the-closure-character 可能會提高效率,但您可能更需要可讀性而不是效率。但是,如果您在單行中使用正則表達式,那麼您已經超出了可讀性預算。$ rename -p '$_=lc; tr/_//; s/\([^)]*\)//g; s/\[[^\]]*\]//g; tr/ /_/' *.demo rename Something (0482) - a123b456 - Something [00xcf bxc v32 Something].demo something__-_a123b456_-_something_.demo