2017-01-20 4 views
2

Ich habe ein AWK-Skript, das eine Datei Zeile für Zeile durchläuft und verschiedene Dinge mit dem, was es findet, die alle gut funktionieren. Vor kurzem wurde festgestellt, dass einige Zeilen ignoriert werden müssen, dass alle das FormatEinfache Whitespace-Check in AWK Regex funktioniert nicht

 FOO_..... 

Also brauche ich Leerzeichen übereinstimmen FOO_ folgen. Es gibt auch Linien, die ich nicht übereinstimmen möchte, dass gehen

 BAR_... FOO_... 

So muss das Spiel Start der Zeile sein. Das sollte alles sehr einfach sein und ich richte es schnell ein

if($0 ~ /^\s*FOO_/) 
{ 
    continue; 
} 

Leider funktionierte das oben genannte nicht. Ich habe versucht, viele Kontrollen, bis ich endlich in der Lage war, diese

zu arbeiten
if($0 ~ /^ *\t*FOO_/) 
{ 
    continue; 
} 

So \s* nicht aus irgendeinem Grund zu bekommen nicht korrekt Leerzeichen übereinstimmen, aber *\t* (ein oder mehr Platz, ein oder mehrere Register) funktioniert . Die zweite Funktion bedeutet, dass alles, was vorhanden ist, entweder ein Leerzeichen oder ein Tab ist, was beide unter \s behandelt werden sollten, also bin ich mir wirklich nicht sicher, warum die \s nicht funktioniert.

Ich kann es mit der anderen Option arbeiten, aber es ist nicht ideal, und ich bin nur neugierig, was dieses Problem verursachen könnte.

Antwort

2

\s ist eine Abkürzung für die POSIX-Zeichenklasse [[:space:]], die nur in einigen Awks funktioniert. Klingt wie das awk, das du verwendest, ist keiner von ihnen.

+0

ich hätte schwören können wir andere awk-Skripte hatte, dass die 'verwendet \ s, aber es ist möglich, ich denke nur an verschiedene Regex, die nicht in awk getan wird. Dies könnte sehr wohl das Problem sein. –

+0

Wenn dies nicht der Fall ist, gibt es noch etwas anderes über Ihre Eingabedaten oder Ihr Skript als das, was Sie uns in der Frage gezeigt haben. Siehe http://stackoverflow.com/help/someone-answers für was zu tun ist, wenn dies Ihre Frage beantwortet hat. Sie sollten wirklich zu 'gawk' wechseln, und dann wird nicht nur' \ s' funktionieren, sondern Sie werden eine Tonne extrem nützlicher zusätzlicher Funktionalität bekommen. –

2

Angenommen Sie haben die Standard-Feldtrennzeichen verwenden, können Sie dieses Problem vermeiden, indem Sie, wenn der erste Wort Überprüfung beginnt mit foo_

if ($1 ~ /^FOO_/) {...} 
+0

Danke, ich bin nicht wirklich sicher, warum ich es nicht so gemacht habe, andere Teile im Skript benutzen $ 0, weil sie die ersten paar Wörter überprüfen, und ich denke, ich bin gerade darin gefangen, Dinge genauso zu machen ohne darüber nachzudenken. –