Schrift
[thread]1094[/thread]

schnelles suchen und ersetzen in dateien

Leser: 3


<< >> 10 Einträge, 1 Seite
esskar
 2003-12-03 16:39
#10827 #10827
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
ich such ne schöne möglich einen string in einer datei zu suchen und durch andere zu ersetzen...
ergebnis kann auch in einer anderen Datei stehen...
hinweise?
Crian
 2003-12-03 17:41
#10828 #10828
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
sed ? Oder muss es in C sein?
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Strat
 2003-12-03 17:52
#10829 #10829
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
perl -i -pe "s/suchtext/ersetzung/g" dateiname

als externes kommando ausfuehren? ;-)\n\n

<!--EDIT|Strat|1070466786-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
esskar
 2003-12-03 19:17
#10830 #10830
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
es muss c/c++ sein...
jedesmal nen prozess zu starten dauert zu lang
Strat
 2003-12-03 19:23
#10831 #10831
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
schade; c/c++ kenne ich da keine schoene moeglichkeit; und den perl-interpreter in c einbauen? perlembed
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
esskar
 2003-12-03 21:00
#10832 #10832
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=Strat,03.12.2003, 18:23]schade; c/c++ kenne ich da keine schoene moeglichkeit; und den perl-interpreter in c einbauen? perlembed[/quote]
Problem: Da müsste ich meinen code offen legen...
das will dann mein chef nicht...
kabel
 2003-12-05 00:50
#10833 #10833
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
idee:

für jede zeile der quelldatei
mittels der funktion strstr die position des zu ersetzenden strings finden
einen neuen string basteln (aufwändig! ) ;
das ganze solange, bis strstr für diese zeile NULL liefert.

keine beispielimplementierung, da mir das string-zerpflücken nicht auf die schnelle machbar schien;
da bist du sicher gut dran, eine abstraktionsbarriere einzubauen.
-- stefan
esskar
 2003-12-05 12:05
#10834 #10834
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
strstr waere wohl schon zu langsam...
hab mal schnell was gebastelt...

muss in 10 minuten uebung abgeben...
muss als aus dem computer raum raus...

poste den algo noch schnell... es kann ihn ja mal jemand verifizieren...

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <stdio.h>

#ifndef size_t
typedef unsigned int size_t;
#endif

#define BMFAILURELEN 256

typedef struct tagSTRINFO
{
char* string;
size_t len;
} STRINFO, *PSTRINFO;

typedef struct tagBMSTRINGO
{
STRINFO strinfo;
int failure[BMFAILURELEN];
} BMSTRINFO, *PBMSTRINFO;

typedef struct tagREPLACEPAIR
{
BMSTRINFO pattern;
STRINFO retval;
} REPLACEPAIR, *PREPLACEPAIR;

int prepareBM(const PSTRINFO inpstrinfo, PBMSTRINFO outpbmstrinfo)
{
int i, len;
char* string;

if(inpstrinfo == 0 || outpbmstrinfo == 0) return 0;

string = inpstrinfo->string;
len = inpstrinfo->len;

outpbmstrinfo->strinfo.string = string;
outpbmstrinfo->strinfo.len = len;

for(i = 0; i < BMFAILURELEN; i++) outpbmstrinfo->failure[i] = len;
for(i + 0; i < len; i++) outpbmstrinfo->failure[string[i]] = len - (i+1);

return 1;
}

int matchBM(const PSTRINFO inpsitext, const PBMSTRINFO inpbmsipat, PSTRINFO outpsiret)
{
int run, len;

if(inpsitext == 0 || inpbmsipat == 0 || outpsiret == 0) return 0;

len = inpbmsipat->strinfo.len;
run = len - 1;
while(run < inpsitext->len)
{
int count = 0;
while(count < len)
{
if(inpsitext->string[run - count] != inpbmsipat->strinfo.string[len - 1 - count]) break;
else count++;
}
if(len == count)
{
outpsiret->string = inpsitext->string + run - count + 1;
outpsiret->len = inpsitext->len - (outpsiret->string - inpsitext->string);
}
else
{
run += ( inpbmsipat->failure[inpsitext->string[run-count]] - count );
}
}

return 0;
}

int main(int argc, char* argv[])
{
printf("fstrrepi test\n");
return 0;
}
\n\n

<!--EDIT|esskar|1070618842-->
SirLant
 2003-12-05 22:54
#10835 #10835
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Viele Compiler haben doch ne regex.h oder regexp.h, Mit den REs sollte es sicher
gehen :)
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
steffenw
 2003-12-06 13:35
#10836 #10836
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=esskar,03.12.2003, 20:00]Problem: Da müsste ich meinen code offen legen...
das will dann mein chef nicht...[/quote]
Bevor ich Perl neu erfinden würde, da gab es doch noch die Möglichkeit Deinen Perl-Code in Bytecode zu übersetzen und den dann anstatt der Perl-Quelle einzubinden. Dann wären Die Ansprüche Deines Chefs erfüllt und Du könntest die Rosinen aus beiden Programmiersprachen picken.

Sagt jetzt nicht, daß man den Bytecode rückübersetzen kann aber ein lesbares Programm wird das dann sicher nicht. Auch C kann man rückübersetzen.
$SIG{USER} = sub {love 'Perl' or die};
<< >> 10 Einträge, 1 Seite



View all threads created 2003-12-03 16:39.