Perl

重命名以刪除特殊字元後的所有內容

  • August 21, 2019

我最近發現了基於 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)。這就是為什麼有一個gin s/ //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替換整個內容。我需要轉義( ) 在左側,因為在未轉義時表示“任何字元”。這在右側不是問題。-``.``.``.``\.``.

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