巴什腳本做我的頭在我已經尋找正則表達式的分配,但並沒有真正找到答案,我明白了。如何捕獲正則表達式的結果,並在bash替換模式
我有一個目錄中的文件。我需要遍歷這些文件並檢查它們是否符合某些標準。在某個序列下的文件名需要增加序列。那些超過特定順序的人需要觸發警報。
我有僞代碼和需要幫助把它變成正確的bash語法:
#!/bin/sh
function check_file()
{
# example file name "LOG_20101031144515_001.csv"
filename=$1
# attempt to get the sequence (ex. 001) part of file
# if sequence is greater than 003, then raise alert
# else change file name to next sequence (ex. LOG_20101031144515_002.csv)
}
for i in `ls -Ar`; do check_file $i; done;
如果PHP是一種選擇,我可以做到以下幾點:
function check_file($file){
//example file 'LOG_20101031144515_001.csv';
$parts = explode('.',$file);
preg_match('/\d{3}$/', $parts[0], $matches);
if ($matches){
$sequence = $matches[0];
$seq = intval($sequence);
if ($seq > 3){
// do some code to fire alert (ex. email webmaster)
}
else{
// rename file with new sequence
$new_seq = sprintf('%03d', ++$seq);
$new_file = str_replace("_$sequence", "_$new_seq", $file);
rename($file, $new_file);
}
}
}
所以長話短說,我希望有人可以幫助將PHP check_file函數移植到bash等價物。
謝謝
感謝您的反饋意見;它看起來非常接近我想要做的事情。然而,我將代碼逐字地拷貝到一個測試文件中,它拋出了下面的關於函數的最後一個結束括號的錯誤:語法錯誤附近的意外令牌'}' – Jordan 2010-10-11 05:06:53
再一次,謝謝。我超越了大括號的語法問題;該腳本缺少「fi」來關閉if塊。此外,該腳本缺少增加seq的位;我將其添加爲「seq = $((seq + 1))」。現在我被卡在最後一個回聲中的替代。在行中,echo「$ {filename %% $ seq.csv} $ newseq.csv」,$ seq不會被$ newseq所取代。而是附加「$ newseq.csv」,結果輸出爲LOG_20101031144515_001.csv002.csv,而不是LOG_20101031144515_002.csv – Jordan 2010-10-11 05:25:40
成功!經過一番狩獵之後,我發現了bash替換模式,並用Dennis的代碼替換了echo線:echo「$ {filename/$ seq/$ newseq} – Jordan 2010-10-11 05:41:07