# (AWK) Regulärer Ausdruck gesucht



## takidoso (7. Juni 2006)

Hallo,
fange gerade an mich mit AWK auseinanderzusetzen bin aber nicht sonderlich mit regulären Ausdrücken bewandert, daher habe ich nun ein kleines Problem damit.

ich möchte alles das finden, was ein *{* hat aber ohne vorangegegangenem *;*

also um alles zu finden was eine geschweifte Klammer hat das geht ganz gut mit *.*{.**  nur wie bringe ich das mit dem nicht Semikolon davor hin?

für Vorschläge bin ich verdammt Glücklich und dankbar

Takidoso


----------



## RedWing (8. Juni 2006)

Hallo,

versuchs doch mal mit dem Ausdruck:

```
.*[^;]{.*
```

Gruß,

RedWing


----------



## Gumbo (8. Juni 2006)

Du musst den Quantor auf die Zeichenklasse anwenden, da sonst du direkt vor der Klammer kein Semikolon vorkommen darf:
	
	
	



```
[^;]*{.*
```


----------



## RedWing (8. Juni 2006)

Hallo,


> Du musst den Quantor auf die Zeichenklasse anwenden, da sonst du direkt vor der Klammer kein Semikolon vorkommen darf:



ich dachte das war die Intention des Autors. So kann man sich taeuschen 

Gruß,

RedWing


----------



## Gumbo (8. Juni 2006)

Gut, bei der etwas schwammigen Beschreibung könnte es auch ein Interpretationsfehler meinerseits sein. Warten wir mal auf die Antwort.


----------



## takidoso (8. Juni 2006)

Hallo ihr beiden
also erstmal vielen Dank für Eure Vorschläge. Leider funktionierte beides nicht.
ich habe nun mal einiges ausprobiert und muss sagen, das Reguläre Ausdrück mir reichlch mystisch sind.

folgende Ausdrücke brachten mich zur identischen Ausgabe aus gabe wie mit .*{.*
.*[^;].*{.*  
[^;].*{.* 
[^;]*{.*



folgende Ausdrücke gaben überhaupt keine Ausgabe
.*[^;]{.*
[^;]{.*

tja dabei habe ich eigetnlich nur situationen wo mal eine geschweifte Klammer ohne und mal mit semikolon davor steht, ohne blanks dazwischen und das zu Begin einer Zeile.

Gibt es in RegExs eigentlich so etwas wie *oder* und *und* Verknüpfungen?
irgendwie ist das ganze in den Seiten in denen ich im Internet gestöbert habe nur sehr rudimentär erklärt mit einfachsten Beispielen  

schade schade 

Takidoso


----------



## Gumbo (8. Juni 2006)

Prinzipiell sind Reguläre Ausdrücke immer UND-verknüpft. Folgender Ausdruck passt nur, wenn „a“ und „b“ aufeinander folgen:
	
	
	



```
ab
```
Eine Disjunktion kann mit dem Senkrechten-Strich-Zeichen bestimmt werden:
	
	
	



```
a|b
```
Passt somit auf „a“ oder „b“.

Regenechsen.de haben zu Regulären Ausdrücken ein umfangreiche Dokumentation parat.


----------



## RedWing (8. Juni 2006)

Hallo,

wenn du sed zur Verfuegung hast kannst du das ja mal ausprobieren:

Datei test.txt:

```
bdf;{bdf
;;{sss
{ssss
aaa{s
dddd
ss{ss
```

Dann:

```
sed -e 's/.*\([^;]\|^\){.*//g' test.txt
```
Ausgabe:

```
bdf;{bdf
;{sss


dddd
```
Also der Ausdruck 

```
.*([^;]|^){.*
```
tuts bei mir auch fuer den Zeilenanfang...



> Gibt es in RegExs eigentlich so etwas wie oder und und Verknüpfungen?



Schau doch mal @ gumbos wiki Link:
http://de.wikipedia.org/wiki/Regulärer_Ausdruck#Alternativen

Gruß,

RedWing


----------



## takidoso (8. Juni 2006)

Hallo RedWig,
danke für Deine Beispiele und Anregungen. Ich habe nu wieder einiges ausprobiert und habe irgendwie das ganz imemrnoch nicht verstanden.
eigetnlich will nur die Zeilen haben, wo kein Semikolon vor einer geschweiften Klammer steht, d.h.

; sdfdf{ sdf                     *soll nicht gellten*
sdfdf ; ssfdd{                 *soll nicht gellten*
;{                                 *soll nicht gellten*
; {                                *soll nicht gellten*
sdfjdfj                           *soll nicht gellten*

*aber....*
{
 df fdf { dfdf 
dfdf {
{ dfdf 
{;                  

sollen gelten

in meinen bisherigen Versuchen auch mit Deinem Vorschlag bekomme ich nicht zufriedenstellendes
meist ist es so dass ;{ tatsächlch als verstanden wird aber ; { ist dann doch in den zutreffenden Lösungen eingebracht.
einer meiner letzten Versuche war
RegExp:
.*([^;].*|^)\{.*

Eingaben:
df {
{sdffd
;{ sdfdf
dfdf;
dfdf;{
dfdf ;{
ddf ; {
 ;{dfdf

Ergebnis:
df {
{sdffd
dfdf;{                   *sollte nicht drinn sein*
dfdf ;{                 *sollte nicht drinn sein*
ddf ; {                 *sollte nicht drinn sein*
 ;{dfdf                  *sollte nicht drinn sein*

Wie gesagt ich habe alles möglich da schon ausprobiert   
offenbar für mich zu hoch zu sein.

ich glaube ich werde das mit einem seperaten if-statement lösen, welches stumpf schaut ob die position eines ; vor einem { gelegen ist

mit frustierten Grüßen

Takidoso


----------



## RedWing (8. Juni 2006)

Hallo,

also ich hab das grad nochmal probiert...

test.txt:

```
df {
{sdffd
;{ sdfdf
dfdf;
dfdf;{
dfdf ;{
ddf ; {
;{dfdf
{as
```

Befehl:

```
awk '/.*([^;]|^){.*/ { print $0 }' test.txt
```

Ausgabe:

```
df {
{sdffd
ddf ; {
{as
```

Also wie du siehst bei mir funktioniert das wie erwartet...

Gruß,

RedWing


----------



## takidoso (9. Juni 2006)

Grüß Dich RedWing,
nein auch bie Dir funktioniert es nicht wie erwartet.
achte doch mal auf Deine vorletzte Ausgabe.
Außerdem wäre noch ein weiterer Testfall interessant nämlich eine Zeile ohne {

Takidoso


----------



## takidoso (9. Juni 2006)

hallo Redwing,
noch ein Nachtrag zu meinem vorherigen...
ich stellte gerade festdas der Testfall doch schon drinn ist (eine Zeile ohne {)
doch interessant sind noch dei Fälle
   ; dsfdf {
;dfdf{
; {


----------



## deepthroat (9. Juni 2006)

Hi.

Also, so wie ich dich verstehe willst du alle Zeilen ausgeben wo eine öffnende geschweifte Klammer drin ist; es darf aber kein Semikolon in dem Text vor dieser Klammer enthalten sein. Richtig?

Dann mußt du nur RedWings reg. Ausdruck etwas anpassen (wobei man dann etwas vereinfachen kann):
	
	
	



```
^[^;]*{
```

Gruß


----------



## takidoso (9. Juni 2006)

Hallo Deapthroat,
auf diesen Gedanken war ich auch schon des öfteren gekommen, hat aber irgendwie nicht funktioniert.
Deswegen sind mir Reguläre Ausdrücke auch irgendwie zu magisch  

naja ich habe es mittlerweile im awk mit zusätzlichen if-klauseln probiert.

vielen Dank für Dein Bemühen 

Takidoso


----------

