Shell-Script
當程序在 cshell 中循環工作時,如何提供新文件名?
我有很多 .dat 文件,我想將它們轉換為 .sac 文件(一種地震圖文件)。我用 xy2sac 程序轉換文件(我沒有編寫程式碼),但我必須給轉換後的文件一個我選擇的新名稱。
轉換器程式碼的工作方式如下:
xy2sac filename.dat newfilename.sac
我想要做的是在 xy2sac 程序循環執行時給出我的新文件名。例如我的 dat 文件名是這樣的:
BRGA_KO_disp_post_mij_conv0000_E.dat BRGA_KO_disp_post_mij_conv0000_E.dat BRGA_KO_disp_post_mij_conv0000_N.dat BRGA_KO_disp_post_mij_conv0000_Z.dat GADA_KO_disp_post_mij_conv0000_E.dat GADA_KO_disp_post_mij_conv0000_N.dat GADA_KO_disp_post_mij_conv0000_Z.dat HYBL_KO_disp_post_mij_conv0000_E.dat HYBL_KO_disp_post_mij_conv0000_N.dat HYBL_KO_disp_post_mij_conv0000_Z.dat ISK_KO_disp_post_mij_conv0000_E.dat ISK_KO_disp_post_mij_conv0000_N.dat ISK_KO_disp_post_mij_conv0000_Z.dat TUZL_KO_disp_post_mij_conv0000_E.dat TUZL_KO_disp_post_mij_conv0000_N.dat TUZL_KO_disp_post_mij_conv0000_Z.dat
我想把他們的名字改成:
BRGA_KO__E.sac BRGA_KO__E.sac BRGA_KO__N.sac BRGA_KO__Z.sac GADA_KO__E.sac GADA_KO__N.sac GADA_KO__Z.sac HYBL_KO__E.sac HYBL_KO__N.sac HYBL_KO__Z.sac ISK_KO__E.sac ISK_KO__N.sac ISK_KO__Z.sac TUZL_KO__E.sac TUZL_KO__N.sac TUZL_KO__Z.sac
所以我想在 .dat 之前選擇前 8 個字元和最後一個字元。
我怎樣才能做到這一點?
我使用了這個循環,但它不起作用,我最終得到了 .dat 文件副檔名。
foreach file (`ls *.dat*`) xy2sac *.dat *.sac << END END end
提前致謝。
如果您真的無法更改為更健全的外殼,那麼 in
csh
,您可以使用:s
修飾符在變數中進行字元串替換前任。
#!/bin/csh -f foreach file ( *.dat ) echo xy2sac $file $file:s/disp_post_mij_conv0000//:s/.dat/.sac/ end
echo
一旦您對文件名正確感到滿意,請刪除
警告:我沒有意識到您正在使用 csh,所以我的回答僅適用於 bash。如果這不是一個選項,其他答案提供了可用的解決方案。
您可以將
=~
運算符與BASH_REMATCH
數組一起使用來匹配文件名的各個部分並將它們組合成新的文件名:#!/bin/bash for file in *.dat do if [[ $file =~ ([A-Z]+_[A-Z]+_).*(..)\.dat ]] then xy2sac $file ${BASH_REMATCH[1]}${BASH_REMATCH[2]}.dac fi done
附帶說明一下,您應該確保您的要求和範例匹配,這樣我們就不必猜測您的實際意思,您不清楚您是否真的需要在命令中輸入一個空的 here-document。我已經建構了與您的範例匹配的程式碼,但顯然要匹配的第一部分並不總是 8 個字元,而且您的意思是 .dat 之前的最後兩個字元(包括
_
,)而不僅僅是最後一個字元。