A
Anonymous
Gast
Ich persönlich halte diese Negation aber dennoch für bedenklich,
vom Anfang der Zeile ein beliebiges Zeichen außer "1" darf beliebig oft vorkommen oder auch gar nicht. Und das bis zum Zeilenende.
Bedenklich deshalb, dieser Reguläre Ausdruck wird sofort unberechenbar wenn der Anfang oder das Ende des Suchabschnittes ohne "1" nicht 100%ig eindeutig angegeben sind. Leere Zeilen werden dabei ausgegeben also entsprechend der Definition alles ohne "1" anzeigen, richtig. Der Ausdruck trifft auf so gut wie fast Alles aber auch auf Nichts zu, wenn man nicht eindeutig sagt, von HIER bis genau HIERHER. Es reicht schon das "^" am Anfang oder "$" zu entfernen und es wird prinzipiell immer Alles gefunden. Wollte man diese Methode innerhalb eines komplexeren Regulären Ausdruck verbauen, müßte man peinlichst genau darauf achten. All zu schnell ist es möglich, das andere Teile des regulären Ausdrucks sich größere Happen schnappen als ihnen zugedacht sind, und das NICHT1 als fehlendes Zeichen interpretiert an eine vollkommen unerwartete Position getroffen wird, und somit einfach komplett übergangen wird. Das Ergebnis könnte dann schnell unberechenbar werden und das Ganze ist dann auch sehr schlecht zu debugen.
vom Anfang der Zeile ein beliebiges Zeichen außer "1" darf beliebig oft vorkommen aber mindestens ein mal. Und das bis zum Zeilenende.
Ist nur ein kleines bisschen sicherer, da an der definierten Stelle mindestens ein Zeichen stehen muss, also ausgeschlossen werden kann, das der Restliche Reguläre Ausdruck davor oder danach das NICHT1 einfach an irgendeiner Stelle ignorieren. Empfindlich ist das aber dennoch allemal, wenn Anfang und Ende nicht fest und sauber definiert werden können. Leeren Zeilen würden allerdings nicht angezeigt, obwohl sie auch keine "1" enthalten und damit normalerweise angezeigt werden sollten. Aber das kommt auf die genaue Aufgabenstellung an, ist erstmal kein genereller Fehler, wenn leere Zeilen ignoriert werden.
Ich persönlich würde jedoch immer versuchen das wirklich Gesuchte positiv mit dem Regulären Ausdruck anzusprechen und dann lieber den Befehl dafür zu negieren. Dieses entspricht mehr einer normalen Denkweise des Menschen und ist deshalb wohl auch innerhalb komplexerer Ausdrücke einfacher zu entwickeln.
überall wo eine "1" drin ist, wird nicht ausgegeben, alles andere schon.
oder
es wird Alles ausgegeben außer Zeilen die eine "1" enthalten, diese werden bei der Ausgabe ignoriert.
Sieht erstmal beides einfach aus. Da die "1" immer definitiv getroffen werden muss, können leichter (jetzt mal behauptet und nicht wirklich ausreichend ausprobiert) auch gummieartige Ausdrücke davor und danach verwendet werden.
Letztlich wie man es dreht oder wendet, bei solcher Art Problemstellung sollte man immer besonders sorgfältig testen.
Bei der Entwicklung sollte man es sich nicht schwerer machen als notwendig und darf bei der Suche nach dem besten Lösungsalgorithmus ruig auf seinen normales Denkmuster aufbauen.
Ein kleiner Selbstversuch könnte hier helfen: einen Zettel nehmen auf dem eine Reihe von mehrstelligen Zahlen steht. Die Aufgabe ist: alle Zahlen abschreiben die keine 1 enthalten. Wer sich jetzt jede Zahl anschaut nach "enthält alles mögliche außer 1" also bekommt diese Zahl einen Hacken, und die abgehakten werden anschließen abgeschrieben, müsste die Variante "/[^1]/p" programmieren.
Wer sich jedoch die Zahlen anschaut und dabei gezielt nur nach 1 sucht und diese Zahlen dann durchstreicht und dann die nicht durchgestrichenen Zahlen abschreibt, sollte lieber "/1/!p" programmieren.
robi
Code:
sed -n ' /^[^1]*$/p'
Bedenklich deshalb, dieser Reguläre Ausdruck wird sofort unberechenbar wenn der Anfang oder das Ende des Suchabschnittes ohne "1" nicht 100%ig eindeutig angegeben sind. Leere Zeilen werden dabei ausgegeben also entsprechend der Definition alles ohne "1" anzeigen, richtig. Der Ausdruck trifft auf so gut wie fast Alles aber auch auf Nichts zu, wenn man nicht eindeutig sagt, von HIER bis genau HIERHER. Es reicht schon das "^" am Anfang oder "$" zu entfernen und es wird prinzipiell immer Alles gefunden. Wollte man diese Methode innerhalb eines komplexeren Regulären Ausdruck verbauen, müßte man peinlichst genau darauf achten. All zu schnell ist es möglich, das andere Teile des regulären Ausdrucks sich größere Happen schnappen als ihnen zugedacht sind, und das NICHT1 als fehlendes Zeichen interpretiert an eine vollkommen unerwartete Position getroffen wird, und somit einfach komplett übergangen wird. Das Ergebnis könnte dann schnell unberechenbar werden und das Ganze ist dann auch sehr schlecht zu debugen.
Code:
sed -n ' /^[^1]\+$/p'
Ist nur ein kleines bisschen sicherer, da an der definierten Stelle mindestens ein Zeichen stehen muss, also ausgeschlossen werden kann, das der Restliche Reguläre Ausdruck davor oder danach das NICHT1 einfach an irgendeiner Stelle ignorieren. Empfindlich ist das aber dennoch allemal, wenn Anfang und Ende nicht fest und sauber definiert werden können. Leeren Zeilen würden allerdings nicht angezeigt, obwohl sie auch keine "1" enthalten und damit normalerweise angezeigt werden sollten. Aber das kommt auf die genaue Aufgabenstellung an, ist erstmal kein genereller Fehler, wenn leere Zeilen ignoriert werden.
Ich persönlich würde jedoch immer versuchen das wirklich Gesuchte positiv mit dem Regulären Ausdruck anzusprechen und dann lieber den Befehl dafür zu negieren. Dieses entspricht mehr einer normalen Denkweise des Menschen und ist deshalb wohl auch innerhalb komplexerer Ausdrücke einfacher zu entwickeln.
Code:
sed -n '/1/!p'
oder
Code:
sed '/1/d'
Sieht erstmal beides einfach aus. Da die "1" immer definitiv getroffen werden muss, können leichter (jetzt mal behauptet und nicht wirklich ausreichend ausprobiert) auch gummieartige Ausdrücke davor und danach verwendet werden.
Code:
sed '/.*1.*/d'
Letztlich wie man es dreht oder wendet, bei solcher Art Problemstellung sollte man immer besonders sorgfältig testen.
Bei der Entwicklung sollte man es sich nicht schwerer machen als notwendig und darf bei der Suche nach dem besten Lösungsalgorithmus ruig auf seinen normales Denkmuster aufbauen.
Ein kleiner Selbstversuch könnte hier helfen: einen Zettel nehmen auf dem eine Reihe von mehrstelligen Zahlen steht. Die Aufgabe ist: alle Zahlen abschreiben die keine 1 enthalten. Wer sich jetzt jede Zahl anschaut nach "enthält alles mögliche außer 1" also bekommt diese Zahl einen Hacken, und die abgehakten werden anschließen abgeschrieben, müsste die Variante "/[^1]/p" programmieren.
Wer sich jedoch die Zahlen anschaut und dabei gezielt nur nach 1 sucht und diese Zahlen dann durchstreicht und dann die nicht durchgestrichenen Zahlen abschreibt, sollte lieber "/1/!p" programmieren.
robi