巴什脚本做我的头在我已经寻找正则表达式的分配,但并没有真正找到答案,我明白了。如何捕获正则表达式的结果,并在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