Merge vraagje

Pagina: 1
Acties:

  • -W0kk3L-
  • Registratie: Juni 2002
  • Laatst online: 20-12-2025
Hallo,

Misschien dat iemand mij hiermee kan helpen...

Ik heb 2 config files (van gameservers). Die wil ik gemerged hebben, alleen ik weet niet hoe ik dit effectief kan doen.

In de eerste file staat:

mp_setting1="100"
mp_setting2="200"
mp_setting3="100"

In de tweede file staat:

mp_setting1="150"
mp_setting4="200"
mp_setting5="300"
mp_setting2="400"

Nu wil ik dus dat de 2 files gemerged worden, en dat de settings van de tweede file blijven staan, en die van de eerste eruit gaan. Iemand een idee hoe ik dit voor elkaar krijg? Ik heb al eens met cdiff lopen spelen, alleen die komt elkens met een schermpje. En hij moet in een script komen te staan, dus in verbose-mode.

Iemand suggesties voor tooltjes of methoden? Ik draai onder FreeBSD 4.9.

  • DeBolle
  • Registratie: September 2000
  • Laatst online: 22:34

DeBolle

Volgens mij ligt dat anders

Ik begrijp niet helemaal wat je wilt, samengevat denk ik dat je het eerste deel uit de file wilt halen en vervangen door het tweede deel?
Beide files zijn gewoon tekstfiles en staan op jouw BSD?
Zo ja, dan gewoon het origineel van de eerste kopieren naar een backupje
(cp filename filename.backup)
Dan de eerste even in vi openen of jouw favoriete editor en simpelweg de regels aanpassen toch?

Specs ...ik doe er niets meer aan.


  • -W0kk3L-
  • Registratie: Juni 2002
  • Laatst online: 20-12-2025
Zou heel logisch klinken, maar het komt voor dat de inhoud van de 2 files wisselt. En ik wil het dus automatisch laten uitvoeren. Vandaar dat ik iets van een tooltje zoekt die ik in een script kan zetten, die dit uitvoert als ik het script draai.

  • moto-moi
  • Registratie: Juli 2001
  • Laatst online: 09-06-2011

moto-moi

Ja, ik haat jou ook :w

Is de inhoud van die files nog gebonden aan een bepaalde volgorde (zoals bijv. de XF86Config-4 file), of niet ?
If not: ff sort eroverheen halen, en daarna een diff ervan trekken moet dan wel werken lijkt me.
Zo niet, dan zou ik het even met de hand doen, dat gaat een stuk sneller dan rare trucjes met tooltjes uithalen en afwachten of het resultaat wel klopt ;)

God, root, what is difference? | Talga Vassternich | IBM zuigt


  • DeBolle
  • Registratie: September 2000
  • Laatst online: 22:34

DeBolle

Volgens mij ligt dat anders

Als de inhoud van de files kan wisselen EN je wilt alleen ALTIJD het eerste door jouw genoemde deel vervangen door het tweede deel dan is sed jouw vriend.

cp filenaam filenaam.backup
sed '1,$s/mp_setting1="100"/mp_setting1="150"/ filenaam > andere_filenaam
[nog wat van dit gerommel]
cp andere_filenaam filenaam
en klaar alweer :)

Specs ...ik doe er niets meer aan.


  • -W0kk3L-
  • Registratie: Juni 2002
  • Laatst online: 20-12-2025
file 1 is zegmaar een orginele config, en file 2 is een custom config. Ik wil de orginele config telkens opnieuw laten updaten met gegevens uit de custom. Beide files kunnen wijzigen, en beide configs hebben enkele regels gelijk. Vandaar dat ik ze wil mergen.

Aangezien het elke nacht moet gebeuren, en het om bijna 25 verschillende bestanden gaat, wil ik dit niet met de hand doen. File 1 is overigens wel altijd gelijk bij alle 25 gevallen. File 2 is echter overal verschillend.

[ Voor 14% gewijzigd door -W0kk3L- op 20-08-2004 22:55 ]


  • Kees
  • Registratie: Juni 1999
  • Laatst online: 12:35

Kees

Serveradmin / BOFH / DoC
Gaat het dan om 1 specifieke setting, of moet je elke nacht alle veranderingen in de custom config doorvoeren in de originele config?

Als het alleen om mp_setting* gaat is het wel te doen, anders wordt het lastiger

code:
1
2
3
4
5
## gebruik van PID=$RANDOM-$$ zodat je niet perongeluk files overschrijft ;)
PID=$RANDOM-$$
grep -v "mp_setting" origineel.conf > /tmp/origineel-$PID
grep "mp-setting" custom.conf >> /tmp/origineel-$PID
mv /tmp/origineel-$PID origineel.conf

Deze code ervan uitgegaan dat
a) volgorde niet uitmaakt
b) het alleen om mp_setting* gaat

[ Voor 9% gewijzigd door Kees op 21-08-2004 00:21 ]

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


  • -W0kk3L-
  • Registratie: Juni 2002
  • Laatst online: 20-12-2025
Het gaat per setting in custom.cfg....bijvoorbeeld in custom staat mp_timelimit 45. In het orgineel staat mp_timelimit 30. Die mp_timelimit 45 moet dus in de nieuwe komen. En dat geldt voor een stuk of 10 settings per file. De settings die alleen in het orgineel staan, en niet in de custom.cfg, mogen niet gewijzigd worden. Het orgineel mag dus enkel aangepast worden met de gegevens die in custom.cfg staan. Een nieuwe output file mag wel. Dubbele regels in de outputfile mag weer niet (dus zowel mp_timelimit 30 als mp_timelimit 45 in de nieuwe file mag niet, want dat vind de gameserver niet echt leuk).

Het lijkt zo simpel he, maar op een of andere manier is het best lastig...

[ Voor 7% gewijzigd door -W0kk3L- op 21-08-2004 09:57 ]


  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Ik weet niet in hoeverre dubbele waardes erg zijn, en of dat spel de config van boven naar onder leest, waarbij de onderste settings de bovenste overriden zegmaar, maar dan zou je gewoon de 2e file kunnen appenden
cat file2 >> file1, dan staan er wel een hoop dubbele in eventueel, maar die uit file2 komen dan als laatste.

  • odysseus
  • Registratie: Augustus 2000
  • Laatst online: 22:08

odysseus

Debian GNU/Linux Sid

Zijn de velden altijd van het formaat [keyword] [spatie] [value]? Zo ja, dan kan je daar iets mee doen. De stappen zouden ongeveer als volgt zijn:

cat custom_bestand orig_bestand > temp
loop temp door van regel 1 tot het eind en verwijder de huidige regel als je al eerder een regel tegen bent gekomen die met hetzelfde keyword begon

Om dit goed te laten werken zal wat sed- en bash-scripting nodig zijn, maar al te ingewikkeld is het niet. Een korte voorzet (in Perl):
code:
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
#!/usr/bin/perl -w

if ($ARGV[0])
{
    open INPUT, "$ARGV[0]";
    @lines = <INPUT>;
    foreach $line (@lines)
    {
        $begin = split /\ /, $line;

        $shouldprint = true;

        foreach $firstword (@firstwords)
        {
            $shouldprint = $shouldprint && ($firstword != $begin);
        }

        if ($shouldprint)
        {
            push(@firstwords, $begin);
            print $line;
        }
    }
    close INPUT;
}
else { die "Usage: mergeconfig [filename]"; }

De tweede foreach-loop is een beetje dubieus (hij kan efficiënter door eerder uit de lus te springen bij een match), maar bovenstaande is wel ongeveer hoe het in elkaar moet steken :). Je kunt nu gewoon iets doen als het volgende:
code:
1
2
cat custom_bestand orig_bestand > temp
mergeconfig temp > nieuw_confbestand

Garanties dat het werkt worden niet gegeven, maar met wat knutselen kom je er wel uit denk ik :).

Leven is het meervoud van lef | In order to make an apple pie from scratch, you must first create the universe.

Pagina: 1