重命名以刪除特殊字元後的所有內容
我最近發現了基於 perl 的
rename
函式,但由於我對 perl 一無所知,所以無法正確使用它。我發現了很多關於這個主題的問題,但沒有任何幫助。我想改名
filename - y01m01 - extra.log filename - y01m02 - extra.log filename - y01m03 - extra.log ... filename - y05m12 - extra.log
進入
filename-y01m01.log filename-y01m02.log filename-y01m03.log ... filename-y05m12.log
我設法重命名為
filename-y01m01 - extra.log filename-y01m02 - extra.log filename-y01m03 - extra.log ... filename-y05m12 - extra.log
使用
rename 's/filename - y*/filename-y/ *.log
但我不知道如何在最後擺脫這個- extra
字元串。中的字元數- extra
不是固定的,取決於每個文件,所以我不能只替換副檔名之前的八個字元。我想解決方案是替換空格(包括空格)之後的所有內容,但我不知道如何編碼。
感謝您的幫助。
該
perl-rename
命令僅使用正則表達式。由於它是 Perl,它使用非常強大的 Perl 兼容正則表達式語言 (PCRE)。因此,如果您想學習如何使用它,只需查找 PCRE。在這種情況下,您似乎想從文件名中刪除所有空格並刪除字元串
-extra
。您可以使用兩個操作,只需用 a 分隔它們;
:$ rename -n 's/ //g; s/-extra//' *.log filename - y01m01 - extra.log -> filename-y01m01.log filename - y01m02 - extra.log -> filename-y01m02.log filename - y01m03 - extra.log -> filename-y01m03.log filename - y05m12 - extra.log -> filename-y05m12.log
意思是“用
s/ //g
空替換所有空格”(因此,刪除所有空格)。預設情況下,此處使用的替換運算符 (s/old/new/options
) 只會替換第一個匹配項。要使其替換所有匹配項,您需要“全域”選項 (g
)。這就是為什麼有一個g
ins/ //g
。just的
s/-extra//
意思是“將第一個匹配替換為-extra
空”。如果這樣做符合您的要求,請再次執行它,但不要使用
-n
. 這使得rename
只需列印出它會做什麼而不實際執行它。對測試非常有用!如果
-extra
不是靜態字元串,但可以更改。您可以改為刪除最後一個之後的所有內容-
,直到下一個.
:$ rename -n 's/ //g; s/-[^-]*\././' *.log filename - y01m01 - extra.log -> filename-y01m01.log filename - y01m02 - extra.log -> filename-y01m02.log filename - y01m03 - extra.log -> filename-y01m03.log filename - y05m12 - extra.log -> filename-y05m12.log
在這裡,
s/ //g
將像以前一樣刪除所有空格,這s/-[^-]*\././
意味著“找到 a ,然後在它後面找到以 a 結尾-
的 0 個或更多非字元的最長部分,並用 a替換整個內容。我需要轉義( ) 在左側,因為在未轉義時表示“任何字元”。這在右側不是問題。-``.``.``.``\.``.