Avatar billede karrieremanden Nybegynder
20. juni 2005 - 01:07 Der er 17 kommentarer

Slette mellem to tegn

Hej,

Jeg prøver igen at spørge efter hjælp til en stump kode.

Jeg har en fil med en masse oplysninger på virtuelle host. filen hedder vhost.ini - i denne fil skal jeg have slettet oplysninger der ligger mellem følgende tegn [user1.domain] og ind til den næste bruger [user2.domain]

Filen indeholder naturligvis flere bruger end userX.domain men hvordan kan jeg slette alt mellem de to bruger.

Håber at en vil hjælpe mig...

Vh.
Avatar billede nielle Nybegynder
20. juni 2005 - 19:43 #1
$DinTekst =~ s/(.*\[user1\.domain\]).+?(\[user2\.domain\].*)/$1$2/g
Avatar billede karrieremanden Nybegynder
21. juni 2005 - 01:08 #2
Hej Nielle,
Tak for dit svar, men jeg er lidt i tvivl her for jeg kan ikke få det til at virke :-(

filen der arbejdes med ser således ud:
_________________________________________________________________
[bruger1.domain.dk]
Automatic Log mailto = bruger@domain.dk
CGI Directory = X:/wwwroot/cgi-bin/
CGI Run As =
Default Page = index.htm index.html index.stm index.asp index.php

[bruger2.domain.dk]
Automatic Log mailto = bruger@domain.dk
CGI Directory = X:/wwwroot/cgi-bin/
CGI Run As =
Default Page = index.htm index.html index.stm index.asp index.php

[bruger3.domain.dk]
Automatic Log mailto = bruger@domain.dk
CGI Directory = X:/wwwroot/cgi-bin/
CGI Run As =
Default Page = index.htm index.html index.stm index.asp index.php
___________________________________________________________________
Hvis jeg nu vil slette bruger "2" skal der slettes fra og med [bruger2...] indtil [bruger3....]

Input kommer fra en form..


Det jeg har lavet ser således ud.

$username ( kommer fra en input form )
$vhost = "f:\vhost\vhost.ini";
open (FILE, "$vhost");
  @user=<FILE>;
   
close(FILE);

open (FILE,">$vhost");
foreach $line (@user) {
$username =~ s/(.*\[user1\.domain.dk\]).+?(\[user2\.domain.dk\].*)/$1$2/g

close (FILE);

Vh.
Avatar billede nielle Nybegynder
21. juni 2005 - 06:32 #3
Hvad sker der da?

Hvis det er slette "for og med" og ikke "Slette mellem to tegn" så der udtrykket sådan her ud:

$DinTekst =~ s/(.*)\[user2\.domain\].*(\[user3\.domain\].*)/$1$2/g;
Avatar billede nielle Nybegynder
21. juni 2005 - 06:53 #4
Min løsning forudsætter at du har indlæst al teksten fra din fil i en og samme scalar $DinTekst. Det har du ikek. I dit tilfælde kan du derfor ikke bruge regulære udtryk sådan som min løsning forudsætter.

Hvis du vil gøre det på den måde, då kan du f.eks. basser din løsning på flag:

$username ( kommer fra en input form )
$vhost = "f:\vhost\vhost.ini";
open (FILE, "$vhost");
    @user=<FILE>;
   
close(FILE);

DeleteMode = "NEJ";

open (FILE,">$vhost");
foreach $line (@user)
{
    if $line eq "[bruger2.domain.dk]"
        DeleteMode = "JA";

    if $line eq "[bruger3.domain.dk]"
        DeleteMode = "NEJ";

    if DeleteMode eq "NEJ"
        echo FILE $line;
}

close (FILE);
Avatar billede karrieremanden Nybegynder
21. juni 2005 - 11:18 #5
Hej Nielle,

Jeg har rodet lidt med dit script og får denne fejl meddelse

C:\>perl -w test.pl
Bareword found where operator expected at test.pl line 13, near "DeleteMode"
        (Missing semicolon on previous line?)
Bareword found where operator expected at test.pl line 16, near "DeleteMode"
        (Missing semicolon on previous line?)
Bareword found where operator expected at test.pl line 19, near "echo"
        (Missing semicolon on previous line?)
Can't modify constant item in scalar assignment at test.pl line 7, near ""NEJ";"

syntax error at test.pl line 12, near "if $line "
Execution of test.pl aborted due to compilation errors.

C:\>

Vh.
Avatar billede karrieremanden Nybegynder
21. juni 2005 - 11:38 #6
Hej igen..
Nu fik jeg fundet en løsning på de fejl, jeg har rodet lidt rundt i dit script.

__
$host = "d:/vhost.ini";
open (FILE, "$host");
    @user=<FILE>;
   
close(FILE);

$DeleteMode = "NEJ";

open (FILE,">$host");
foreach $line (@user) {
    if ($line eq "[*.opasiachat.dk]")
      {
$DeleteMode = "JA";
    }

    if ($line eq "[") {
        $DeleteMode = "NEJ";
    }
    if ($DeleteMode eq "NEJ") {
        echo FILE $line;
print "<html><head>";
    print "<title>Dine oplysninger er hermed slettet !</title>\n";
    print "</head>\n";
    print "<center>\n";
    }
}

close (FILE);
__

Ingen fejlmeddelser, men scriptet sletter ALT indhold i filen, det var nu ikke meningen :-)

Vh.

Niels
Avatar billede nielle Nybegynder
21. juni 2005 - 19:33 #7
Det forstår jeg nu ikke, for din kode burde faktisk ikke slette noget som helst:

I dit eksempel (21/06-2005 01:08:59) har du hverken en line som indeholder:

[*.opasiachat.dk]

- eller en som indeholder:

[

- og derfor vil $DeleteMode aldrig ændre værdi væk fra den oprindelige "NEJ".

Bare så der ikke er tvivl. Det at inkludere et '*' betyder ikke at den vil matche noget som f.eks.:

[nielle.opasiachat.dk]

Operatoren eq matcher på den eksakte streng og * fungere ikke som et wildcard i den sammenhæng.

Hvis det nu rent faktisk er sådan at det *er*:

[*.opasiachat.dk]

- som du vil lede efter, så har jeg opdaget en grund til at det fejler. Sagen er nemlig den at hver af dine linjer afsluttes med et linje-skift tegn. Når der skal tjekkes på indholdet af linjen, skal man huske at tage højde for dette.

Jeg vil foreslå en anden fremgangs måde end at læse filens indhold ind i et array. I stedet villejeg læse det ind i en scarlar, manipulere på denne med regulære udtryk og så skrive det hele ud igen:

open (INDATA, "<$host");
while(<INDATA>)
{
    $content .= $_;
}
close(INDATA);

$content =~ s/^(.*)\[bruger2\.domain\.dk\].+(\[bruger3\.domain\.dk\].*)$/$1$2/g

open (UDDATA, ">$host");
print UDDATA $content;
close(UDDATA);

Tilsidst et lille råd. Du skriver direkte til din fil $host. Aldrig, aldrig, aldrig gøre sådan noget. Skriv først til en midlertidig fil og tjek så¨om det gik godt. Først derefter må den oprindelige fil slettes og erstattes med den nye.
Avatar billede karrieremanden Nybegynder
22. juni 2005 - 11:52 #8
Hej Nielle,

Er der en fejl i denne linie.. jeg kan nemmerlig ikke se den.. :-(

Jeg har kommentere en del i scriptet, jeg håber du kan forstå det.

$host = "d:\\vhost.ini";
$hoste = "d:\\vhosts.ini"; # tester om scriptet gemmer i en anden fil.

##################################
# denne variabel skal ikke være i scriptet, men får sine oplysninger fra
# ($in{'username'})
# Variablen $slet kan også hedde dom1.opasiachat.dk men dette kan jeg
# filtrere fra i selve hovede scriptet.

$slet ="dom1";

###################################

open (INDATA, "<$host");
while(<INDATA>)
{
    $content .= $_;

#### viser mig en skærm udskrigt ####

print "<html>tjek<head>";
    print "<title></title>\n";
    print "</head>\n";
    print "content :$content\n";
#####################################

}
close(INDATA);

$content =~ s/^(.*)\[$slet\.opasiachat\.dk].+(\[.*)$/$1$2/g

# Jeg har ændret slutningen af denne til .+(\[.*)$/$1$2/g da jeg ikke ved hvilket
# subdomæne der kommer efter det der skal slettes. Det kan eks. være dom12.opasiachat.dk


open (FILE,">$hoste");
print FILE "$content";
close (FILE);

Scriptet melder følgende fejl:
Syntax err. at test.pl line 36 near "open "
Denne fejl får jeg hvis jeg sætter et "#" tegn foran følgende:
$content =~ s/^(.*)\[$slet\.opasiachat\.dk].+(\[.*)$/$1$2/g

Har også prøvet med følgende og får samme resultat:
$content =~ s/^(.*)\[bruger2\.domain\.dk\].+(\[bruger3\.domain\.dk\].*)$/$1$2/g

Hvis jeg sætter "#" foran linien får jeg ingen fejl og scriptet gemmer oplysningerne i en ny ( se kommentar i scriptet ) , men linien slettes naturligvis ikke så.

Jeg er ikke speciel god til PERL så derfor har jeg det godt med at bruge ### :-) Så ved jeg nogenlunde hvad der sker..

Kan du se fejlen ?
Hvis det er ved at blive for meget skriveri her er jeg at fange på msn@npnet.dk

Vh.

Niels
Avatar billede karrieremanden Nybegynder
22. juni 2005 - 13:19 #9
Fandt en af fejlene.. der mangler et ; i slutningen af linien:
#
$content =~ s/^(.*)\[bruger2\.domain\.dk\].+(\[bruger3\.domain\.dk\].*)$/$1$2/g
#

Men det virker stadigvæk ikke... ingen ting bliver slettet
Tror jeg er ved at have prøvet alt muligt, men er virklig lost her...

Vh.

Niels
Avatar billede nielle Nybegynder
22. juni 2005 - 17:40 #10
Ser din indputfil virkelig ud som det du har postet i 21/06-2005 01:08:59? Jeg spørger fordi at din kode fra 21/06-2005 11:38:29 ser ud dom om at der står noget helt andet i filen.

Det regulære udtryk jeg har angivet basere sig på at det ser ud som i 21/06-2005 01:08:59, og der er ingen grund til at antage at den skulle virke for noget som *ikke* ser sådan ud.
Avatar billede karrieremanden Nybegynder
23. juni 2005 - 00:39 #11
Hej,
En brugers oplysninger starter i vhost filen med eks.
[bruger1.opasiachat.dk]
...
....
.....
......

[bruger2.opasiachat.dk]
...
....
.....
......

[bruger3.opasiachat.dk]
...
....
.....
......

osv. osv

Opasiachat.dk] er altid det samme, dette ændre sig ikke.
Oplysninger under eks. [bruger3.opasiachat.dk] er de samme med undtagelse
af:

Automatic Log mailto = bruger@opasiachat.dk -

I dit eksempel har jeg naturligvis prøvet at skifte domain.dk ud med opasiachat.dk - uden held.

Når en bruger får en hjemmeside konto oprettes personen i vhost filen ved at skrive til filen på denne måde:
##
open filehandle, ">>$vhostfile";
print filehandle "$vhost \n";
print filehandle "Automatic Log mailto = $username\@opasiachat.dk \n";
print filehandle "CGI Directory = X:/wwwroot/cgi-bin/ \n"
print filehandle "CGI Run AS = \n";
print filehandle "Default Page = $default_page \n";

close filehandle;
Tænkte det måske kunne hjælpe at oplyse dette :-)
Avatar billede karrieremanden Nybegynder
23. juni 2005 - 09:59 #12
Hej Nielle,

Jeg har siddet og rodet lidt.. får forskellige fejl meddelser :-(

Jeg har linket til scriptet her www.opasiachat.dk/cgi-bin/test.pl

Der er ftp adgang til scriptet hvor vhost filen også ligger.
Der er kun et par filer så der sker vist ikke det vilde ved at smide login oplysningerne her..

ftp : opasiachat.dk
kode 1234

Det ville være meget lækkert hvis jeg kunne få skidtet til at virke. Jeg er ved at få grå hår af det *grrr* - flere end jeg har i forvejen, men det er pga alderen *LOL*

Vh.

Niels og tusinde tak for din hjælp :-)
Avatar billede nielle Nybegynder
24. juni 2005 - 21:13 #13
Sådan her:

open (INDATA, "<vhost.ini");
@content = <INDATA>;
close(INDATA);

$content = join("", @content);
$content =~ s/^(.*)\[bruger2\.domain\.dk\].*(\[bruger3\.domain\.dk\].*)/$1$2/s;

open (UDDATA, ">vhost2.ini");
print UDDATA $content;
close (UDDATA);

Det lille 's' i enden af "$content =~ ..." linjen gør hele forskellen.
Avatar billede nielle Nybegynder
28. juni 2005 - 18:02 #14
Har du fået afprøvet det?
Avatar billede nielle Nybegynder
11. juli 2005 - 20:00 #15
Lukketid?
Avatar billede nielle Nybegynder
12. august 2005 - 09:52 #16
Tja, nu smider jeg da i hvert fald et svar. :^|
Avatar billede nielle Nybegynder
02. december 2007 - 10:31 #17
Lukketid?!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester