![]() |
Hej og Velkommen fra USA til UNIX og Linux Forums! Tak for dit besøg og deltager i vores globale samfund.
|
|
google unix.com
|
|||||||
| Forums | Registrer | Forum Regler | Links | Albums | FAQ | Members List | Kalender | Søgning | Dagens Stillinger | Mark Forums Read |
| Shell Programmering og Scripting Post spørgsmål om ksh, CSH, SH, Bash, Perl, PHP, SED, AWK og ANDRE shell scripts og Shell scriptsprog her. |
Mere UNIX og Linux Forum Emner du måske kan finde Helpful
|
||||
| Tråd | Thread Starter | Forum | Svar | Last Post |
| gzcat i awk og derefter ændre FILENAME og behandle nye FILENAME | timj123 | Shell Programmering og Scripting | 6 | 06-23-2008 07:45 AM |
| del af et filnavn | flame_eagle | Shell Programmering og Scripting | 8 | 02-28-2008 11:18 AM |
| Rapport fra duplikateksemplaret filer baseret på en del af filnavnet | sudheshnaiyer | UNIX for dummyer Spørgsmål & svar | 1 | 12-18-2007 04:31 PM |
| læse en del af filnavnet fra listen i scriptet | happyv | Shell Programmering og Scripting | 3 | 10-20-2006 09:58 AM |
| Ønskede at fjerne numeriske del af et filnavn | Sona | UNIX for dummyer Spørgsmål & svar | 8 | 07-20-2006 02:49 PM |
![]() |
|
|
LinkBack | Thread Tools | Søg denne tråd | Rate Thread | Display Modes |
|
|
|
||||
|
afsløre den del af et filnavn
Jeg vil gerne have den dato i 2008/09/01 format i starten af min filnavne. Jeg så orddeling efter det og så har min filnavn.
Jeg har et script, der skaber dette for mig. Dog kan jeg arbejde på filer, der allerede har datoformat, der allerede i dér, og jeg ønsker ikke at have en dato to gange. Er der en måde at opdage nummer eller noget i begyndelsen af filnavnet, og i bekræftende fald derefter skære den dato? |
|
||||
|
Det var i stedet for denne, datoer er rodet
Code:
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 stedet. Chris var teknisk korrekt, ingen tvivl om - men nytten af ovenstående er begrænset. I del dette skyldes den måde, datoer er konstrueret - og ovenstående regex er ikke perfekt. Det vil tænke 2008-19-19 er en dato - som det ikke er. Mest korrekte dato regexes er flere hundrede tegn lang. Den eneste guld standard er at henvise til produktion af cal. Vi bruger en del af denne dato check algoritme nedenfor (forenklet betydeligt) til validering gamle datoer. Dette er mere næsten fuldstændig & & korrekte end de fleste lige shell implementeringer bruger regex sandsynligvis vil være. Jeg bevidst udelukket Code:
/* 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;
}
|
|
||||
|
Thanks guys. Jeg gik med Chris's løsning. Det er begrænset som du sagde Jim (du skal have nøjagtige syntaks for at arbejde), men Jim din løsning er langt over mit hoved for en nybegynder! For hvad jeg gør Chris's vil gøre fint. Tak til jer alle.
|
![]() |
| Bogmærker |
| Thread Tools | Søg denne tråd |
| Display Modes | Bedøm denne tråd |
|
|