は、これに代えて、日付散らかっている
コード:
echo $filename | \
sed 's/\(^[1-2][0-9]\{3\}\)-\([0-1][0-9]\)-\([0-3][0-9]\)-\([A-Z_0-9a-z]*\)/\4/' | read newfilename
if [[ ! -z newfilename ]] ; then
filename=$newfilename
fi
基本的に私は一日の主要な問題を抱えているすべてのファイルの名前をお勧めします。挑戦する
はls - lの代わりに。技術的に修正されたクリスは間違いない-制限されていますが、上記の有用性。一部ではこの日のために建設されているようだ-と、上記の正規表現は完璧ではない。 2008-19-19一日になると思うんですよ-これではありません。最も正しい日付正規表現している数百の文字長い。金本位制校正のみの出力を参照することです。
私たちは(非常に)古い日付を検証するための簡略化アルゴリズムの一部を以下に、この日付を確認します。これはほぼ完了です& &ストレート、シェルの実装が正しいが、大抵の正規表現を使用しているそうだ。私は故意に除外
コード:
/* chpdt.c
usage chpdt filename
echo "$filname" | chpdt
*/
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <stdio.h>
#define isleapyr(y) (((y) % 4) == 0 && ((y) % 100) != 0 || ((y) % 400) == 0)
int leap[12]= {31,29,31,30,31,30,31,31,30,31,30,31};
int nleap[12]={31,28,31,30,31,30,31,31,30,31,30,31};
char *date_ok(char *result, char *src)
{
int value=atoi(src);
int month=0;
char *p=src;
int *v=nleap;
if( value >= 1900 && value < 2038 && (p=strchr(p, '-')) != NULL )
{
if(isleapyr(value))
v=leap;
value=atoi(++p);
if(value >= 1 && value < 13 && (p=strchr(p, '-')) != NULL)
{
month=value;
value=atoi(++p);
if( value > 0 && value < v[ month - 1 ] )
if( (p=strchr(p, '-')) != NULL)
result=++p;
}
}
return result;
}
char *name_ok(char *p, char *src)
{
if(src[4]=='-' && src[7]=='-' && src[10]=='-')
p=date_ok(p, src);
return p;
}
int main(int argc, char **argv)
{
int retval=0;
char tmp[PATH_MAX + 2]={0x0};
char *p=NULL;
if (argc < 2)
{
if(fgets(tmp, sizeof(tmp), stdin) ==NULL)
{
perror("I/O error");
retval=1;
};
p=strchr(tmp, '\n');
if(p!=NULL)
*p=0x0;
}
else
(void)strncpy(tmp, argv[1], PATH_MAX);
p=tmp;
if(strlen(tmp) > 10 && !retval) /* will return zero length if string is "date-"*/
p=name_ok(p, tmp);
if( fprintf(stdout, "%s", p) < 0)
{
perror("I/O error");
retval=1;
}
return retval;
}
これで頑張ってください。
|