刪除檔案名稱開頭和結尾的字元模式

刪除檔案名稱開頭和結尾的字元模式

我有一堆文件想要重命名。它們的檔案名稱採用特定格式:

p1.uniquenameA#blah_a
p2.uniquenameB#blah_b
p3.uniquenameC#blah_c
p4.uniquenameD#blah_d
p5.uniquenameE#blah_e
p6.uniquenameF#blah_f
p7.uniquenameG#blah_g
p8.uniquenameH#blah_h
p9.uniquenameI#blah_i
p10.uniquenameJ#blah_j

每個唯一的檔案名稱之前都有一個前綴。在這種情況下,該前綴以字母開頭p,後面有一個數字,p該數字遞增一。句點 ( .) 將前綴與唯一檔案名稱分隔開。每個唯一檔案名稱後面都有一個以主題標籤 ( #) 開頭的後綴。我想刪除從句點開始的前綴(包括句點),我還想刪除從主題標籤開始(包括主題標籤)的後綴。我希望生成的檔案名稱只是句點和哈希標籤之間的唯一檔案名,如下所示:

uniquenameA
uniquenameB
uniquenameC
uniquenameD
uniquenameE
uniquenameF
uniquenameG
uniquenameH
uniquenameI
uniquenameJ

我是腳本編寫新手,因此如果您除了提供程式碼之外還能解釋程式碼的工作原理,我將不勝感激。

答案1

如果您擁有perl的版本rename(有時稱為prename),您可以套用正規表示式替換:

rename -n 's/^.*?\.(.*?)#.*/$1/' *

如果您不了解正規表示式 (RE),它們非常值得學習。

  • s/xx/yy/- 用xxyy
  • ^- 匹配隱式行首
  • .*?- 盡可能匹配短的字串任何內容的零個或多個字符以模式匹配的其餘部分為準
  • \.- 匹配文字點.(該.字元代表任何事物,但是\.是一個字面點)
  • (....)匹配括號內的模式並為其指定匹配編號 1..9;後來被引用$1(第二個(......)將是$2,等等)
  • #- 文字字符
  • .*- 最長的比賽是任何內容的零個或多個字符(這.任何事物*前一項的意思是_零個或多個)

-n當您高興時刪除(“無操作”)工作。將其替換為-v以查看實際發生的情況,或忽略它以進行靜默操作。

答案2

這是awk執行該任務的腳本:

僅用於列印/調試:

awk 'match($0,/(^[^\\.]+.)([^#]+)/,m){print "mv "$0" "m[2] }' input.txt    

進行重新命名:

awk 'match($0,/(^[^\\.]+.)([^#]+)/,m){system("mv "$0" "m[2])}' input.txt    

輸入.txt

p1.uniquenameA#blah_a
p2.uniquenameB#blah_b
p3.uniquenameC#blah_c
p4.uniquenameD#blah_d
p5.uniquenameE#blah_e
p6.uniquenameF#blah_f
p7.uniquenameG#blah_g
p8.uniquenameH#blah_h
p9.uniquenameI#blah_i
p10.uniquenameJ#blah_j

輸出

mv p1.uniquenameA#blah_a uniquenameA
mv p2.uniquenameB#blah_b uniquenameB
mv p3.uniquenameC#blah_c uniquenameC
mv p4.uniquenameD#blah_d uniquenameD
mv p5.uniquenameE#blah_e uniquenameE
mv p6.uniquenameF#blah_f uniquenameF
mv p7.uniquenameG#blah_g uniquenameG
mv p8.uniquenameH#blah_h uniquenameH
mv p9.uniquenameI#blah_i uniquenameI
mv p10.uniquenameJ#blah_j uniquenameJ

答案3

這是一個使用的解決方案sed

for i in *
do
    mv $i $( echo $i | sed 's/p[[:digit:]]*\.\([^#]*\)\#.*/\1/' )
done

目標是sed透過查找p後跟任意數量的數字和句點來創建的。從這個時期開始直到#記住了到暫存器中,整個檔案名稱被替換為記住了人物。

相關內容