# [OT] awk / mawk REPLACE STRINGS in Textfile

## benjamin200

Hallo Leute,

bin nicht gleich den Kopf abreisen, da ich awk bzw. mawk auf einem Windows System laufen lassen will / muss. Ich benötige dringends die Möglichkeit beliebige STRINGS in einer textbasierenden Datei zu änderen. Konkret geht es um *.reg Dateien. Ich weiss genau was ich will, aber nicht wie ich es mit awk / bzw. mawk (awk für Windows) machen kann. Hoffe jemand von euch kann mir helfen.

Ich möchte mit AWK / mawk beliebige STRINGS in einer textbasierenden Datei via CLI mit Parameter überagabe von austauschen / replacen. Der Dateiname, Pfad und beide Strings sollen sich über Variablen deklarieren lassen. Wie stelle ich das mit awk / mwak an?

Bsp. Eintrag der textbasierenden Datei:

```

[HKLM\Software\Supertool\V-43454:445\Config\Main]

```

soll geändert werden in:

```

[HKLM\Software\Supertool\V-67565:545\Config\Main]

```

Habe schon folgenden Hinweis gefunden, werde aber leider nicht daraus schau. 

 *Quote:*   

> 
> 
> gsub(regexp, replacement [, target]) 
> 
> This is similar to the sub function, except gsub replaces all of the longest, leftmost, non-overlapping matching substrings it can find. The `g' in gsub stands for "global," which means replace everywhere. For example: 
> ...

 

Bin über jeden Ratschlag dankbar. Vielen Dank schonmal an alle AWK Programmiere / Künstler die versuchen zu helfen  :Smile: 

Gruß,

Benjamin

----------

## smg

Hi!

Ich gebe dir nur mal einen kleinen Ansatz:

Probiere doch einfach mal zu matchen und dann gsub anzuwenden.

 *Quote:*   

> awk ' /fubar/{ gsub(/fubar/, "foo?"); print } '

 

sowas?

Vielleicht kannst du es auch einfach mit sed realisieren.

Bye.

----------

## benjamin200

 *Quote:*   

> 
> 
> Ich gebe dir nur mal einen kleinen Ansatz: 
> 
> 

 

Verrate mir doch wie es funktioniert, der kleine Ansatz bring einen Neuling im Programmieren auch nicht weiter  :Sad: 

 *Quote:*   

> 
> 
> Probiere doch einfach mal mit ~= zu matchen und dann gsub anzuwenden. 
> 
> 

 

Matchen, häää, verstehe nur Bahnhof.

 *Quote:*   

> 
> 
> Vielleicht kannst du es auch einfach mit sed realisieren.
> 
> 

 

sed? Ich möchte es mit mawk auf Windows realisieren.

Kann mir jemand bitte den Befehl verraten?

----------

## smg

Btw, wie sieht denn dein String aus, welches Muster hat er?

```

awk ' { if ($0 ~ /your_regex_here/); print } ' $FILE

```

Bye.

----------

## benjamin200

hatte ich oben erwähnt:

 *Quote:*   

> 
> 
> Bsp. Eintrag der textbasierenden Datei: 
> 
> Code: 
> ...

 

----------

## smg

43454:445 <-- das soll geändert werden

67565:545 <-- in das?

nur das in das? oder sonst noch was?

dann würde ich vorschlagen

```
awk ' { if ($0 ~ /43454:445/); gsub(/43454:445/, "67565:545"); print } ' $FILE > $FILE
```

Pattern kannst du einfach als zwei Variablen defineiren und dann in das gsub reinhaue, jedoch dann doppelte Anführungszeichen wegen dem Interpolieren, und manche Sachen escapen da sie von der $SHELL interpretiert werden könnten.

Bye.

P.S.: Steht dir denn kein Sed zu Verfügung? Weil sonst müsstest du die awk Ausgabe in ne Datei wieder umleiten, bei sed gibt's den -i switch dafür..

P.P.S.: Hilfst dir das denn wenigstens bisschen?

----------

## benjamin200

 *Quote:*   

> 
> 
> 43454:445 <-- das soll geändert werden
> 
> 67565:545 <-- in das?
> ...

 

Das wäre es

 *Quote:*   

> 
> 
> P.S.: Steht dir denn kein Sed zu Verfügung? Weil sonst müsstest du die awk Ausgabe in ne Datei wieder umleiten, bei sed gibt's den -i switch dafür.. 
> 
> 

 

Gibt es sed auch als binary für Windows?

 *Quote:*   

> 
> 
> P.P.S.: Hilfst dir das denn wenigstens bisschen?
> 
> 

 

unter awk auf Linux läuft es, genial  :Smile:  jetzt noch mit mawk testen. Müssten doch die selben Parameter sein ***Daumendrück***

----------

## smg

Oh, sorry. Ich überlese wohl immer wieder (mit Absicht?!), dass du ja diese Sache auf Windows laufen lassen musst. Ich weiß nicht ob es ein Binary für Sed für Windows gibt - wohl nicht.  :Smile: 

Sed wäre halt _schöner_ aber da es ja nicht verfügbar ist hält eben mawk her.  :Wink: 

Kann man sicherlich noch verbessern den awk Befehl.

Bye.

----------

## benjamin200

Wie schön erwähnt läuft es unter Linux, aber mit mawk will es nicht. 

```

D:\mawk32>mawk ' { if ($0 ~ /43454:445/); gsub(/43454:445/, "67565:545"); print

} ' D:\mawk32\test.txt > D:\mawk32\test1.txt

```

Kann jemand mit dieser Fehler Meldung etwas anfangen?

```

mawk: line 1: runaway string constant " ...

```

----------

## benjamin200

 *Quote:*   

> 
> 
> Oh, sorry. Ich überlese wohl immer wieder (mit Absicht?!), dass du ja diese Sache auf Windows laufen lassen musst. Ich weiß nicht ob es ein Binary für Sed für Windows gibt - wohl nicht.  
> 
> 

 

Kein Problem, aber leider läuft es unter Windoof mit mawk nicht. Die Fehlermeldung bring mich leider nicht weiter (siehe oben). 

Fählt dir noch was ein? Falls du es auch probieren will (auf windoof oder mit wine) Hier der Link zu den Sourcen v1.3.3.

Sourcen: http://www.klabaster.com

----------

## smg

Probier mal das:

```
mawk ' { if ($0 ~ /43454:445/) gsub(/43454:445/, 67565:545); print } ' "$FILE" > "$FILE"
```

Vielleicht geht es damit..

----------

## benjamin200

Die Pfade zu maskieren hatte ich schon probiert aber hier nochmal. Selbe Fehlermeldung

```

mawk ' { if ($0 ~ /43454:445/) gsub(/43454:445/, 67565:545); print } ' "D:\mawk32\test.txt" > "D:\mawk32\test1.txt"

D:\mawk32>mawk ' { if ($0 ~ /43454:445/) gsub(/43454:445/, 67565:545); print } '

 "D:\mawk32\test.txt" > "D:\mawk32\test1.txt"

```

```

mawk: line 1: runaway string constant " ...

```

Gibt es einen einfach PRINT Befehl, z.B. HELLO WORLD oder so?

----------

## benjamin200

hat noch jemand eine Idee?

----------

## amne

Ins Diskussionsforum verschoben.

----------

## benjamin200

ist aber viel weniger los hier  :Sad: 

Hoffe jemand ließt noch meinen Thread

----------

## Fibbs

Ohne mich jetzt mit awk auszukennenn....

wäre es nicht eine Möglichkeit, auf den Windows-Kübel cygwin zu installieren und dann doch sed zu benutzen?

Gruß

Fibbs

----------

## benjamin200

Servus Fibbs,

ja wäre es, da ich diesen REPLACE zur editierung benötige. Es gibt keine Möglichkeit cygwin zu installieren.

Es soll alles über ein Skript abgewickelt werden.

Kennst du dich etwas mit awk bzw. mawk aus?

----------

## Finswimmer

Nach google groups:

Perhaps the problem is the slash in the [...] class; mawk seems to be

taking it to denote the end of the regular expression.

Scheint also an der Win Version von mawk zu liegen.

Versuchs mal mit nem Backslash

----------

## think4urs11

übersehe ich hier jetzt irgendwas entscheidendes - z.B. das Problem? (ja ich weiß blöde Frage, is schon spät)   :Rolling Eyes: 

SED für Windows ... so gesucht: Wie find ichs; 2. Treffer

```
D:\>more test.txt

[HKLM\Software\Supertool\V-43454:445\Config\Main]

bla

nochwas

[HKLM\Software\Supertool\O-43454:445\Config\Main]

ende

D:\>c:sed -e s/43454:445/67565:545/g test.txt

[HKLM\Software\Supertool\V-67565:545\Config\Main]

bla

nochwas

[HKLM\Software\Supertool\O-67565:545\Config\Main]

ende
```

----------

## benjamin200

```

mawk ' { if ($0 ~ /43454:445/) gsub(/43454:445/, 67565:545); print } ' "D:\mawk32\test.txt" > "D:\mawk32\test1.txt"

```

 *Quote:*   

> 
> 
> Nach google groups: 
> 
> Perhaps the problem is the slash in the [...] class; mawk seems to be 
> ...

 

wohin soll der Backsplash?

 *Quote:*   

> 
> 
> übersehe ich hier jetzt irgendwas entscheidendes - z.B. das Problem? (ja ich weiß blöde Frage, is schon spät)  
> 
> SED für Windows ... so gesucht: Wie find ichs; 2. Treffer 
> ...

 

Bin mir nicht sicher was du mit den letzen Zeilen anstellen willst? HIV Keys bearbeiten / kopieren / editieren? Kannst du mir vielleicht ein simples Example Comand für den Replace Befehl schicken?

----------

## think4urs11

 *benjamin200 wrote:*   

> Bin mir nicht sicher was du mit den letzen Zeilen anstellen willst? HIV Keys bearbeiten / kopieren / editieren? Kannst du mir vielleicht ein simples Example Comand für den Replace Befehl schicken?

 

Das Beispiel tut nichts anderes als in einer gegebenen Textdatei (d:\test.txt) die Zeichenfolge 43454:445 gegen 67565:545 auszutauschen und zwar überall wo es gefunden wird, was eben in SED-Syntax s/43454:445/67565:545/g heißt.

Wenn du z.B. nur das fünfte Erscheinen dieser Zeichenfolge austauschen möchtest, die ersten 4 aber nicht angetastet werden sollen so ist das 'g' durch eine '5' auszutauschen.

Kleines deutsches HowTo für sed: http://www.linux-fuer-alle.de/doc_show.php?docid=181&catid=8

Das war doch was du wolltest oder nicht?

----------

## benjamin200

ja genau. Werde es morgen gleich testen und mich wieder melden. Vielen Dank nochmal.

Was mich aber denoch brennend interessiert, wie läuft das ganze mit mawk. Irgenwas Stimm in dem Syntax nicht. Unter ACK 1.3.3 Gentoo läuft es sauber, aber mit mawk, gawk etc. klappt es nicht. Wo muss ich den Backslash setzen bzw. gegen was tauschen?

----------

## think4urs11

bei awk muß ich passen; benutze ich nur wenn es gar nicht mehr anders geht.

Meistens geht das was ich so brauche auch ohne.

----------

## benjamin200

 *Quote:*   

> 
> 
> bei awk muß ich passen; benutze ich nur wenn es gar nicht mehr anders geht. 
> 
> Meistens geht das was ich so brauche auch ohne.
> ...

 

werd es auf jedenfalls morgen mit sed probieren. Danke nochmal Think4UrS11.

Achja, wenn noch jemand bezüglich mawk weiterhelfen kann, bitte POSTEN. DANKE  :Smile: 

----------

## benjamin200

BUMP

----------

