Regular-Expression

如何將多個正則表達式壓縮為單行?

  • August 25, 2022

我無法將幾個正則表達式壓縮成一個有效的單行。我有這樣命名的文件名:Something (0482) - a123b456 - Something [00xcf bxc v32 Something]. 我希望結果是something-a123b456-Somethingsomething_-_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

引用自:https://unix.stackexchange.com/questions/714899