Shell-Script

當程序在 cshell 中循環工作時,如何提供新文件名?

  • October 16, 2019

我有很多 .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 之前的最後兩個字元(包括_,)而不僅僅是最後一個字元。

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