Suche grep, das whitespace ignoriert

13/01/2008 - 14:56 von Martin Klaiber | Report spam
Ich suche ein grep (oder àhnliches tool), das whitespace ignorieren
kann. Zweck ist die Suche nach Telefonnummern, die Leerzeichen
enthalten können.

Beispiel: die Telefonnummer 1234567 wird oft in einer der folgenden
Formen abgespeichert:

1 23 45 67
123 45 67
12 34 567

Alle sollen gefunden werden. Eine Möglichkeit wàre natürlich, im Text
einfach Leerzeichen innerhalb von Telefonnummer zu verbieten, aber das
schrànkt die Lesbarkeit für Menschen ein, scheidet also aus. Auch die
Lösung, eine feste Schreibweise vorzuschreiben, scheitert in der Regel
am Faktor Mensch.

Schön wàre ein grep, das Leerzeichen ignorieren könnte. Ich habe aber
nichts in der Richtung gefunden. Zur Zeit behelfe ich mir damit:

cat telefon.dat | sort | while read zeile; do
echo "$zeile" | sed 's/\ //g' | grep -iq $1 && \
{
echo "$zeile" | ...
...
}
done

Das funktioniert zwar, ist aber ziemlich langsam. Weiß jemand, woran
das liegt, und wie man das verbessern könnte?

TIA, Martin
 

Lesen sie die antworten

#1 Alexander Bartolich
13/01/2008 - 15:27 | Warnen spam
Martin Klaiber schrieb:
[...]
cat telefon.dat | sort | while read zeile; do
echo "$zeile" | sed 's/\ //g' | grep -iq $1 && \
{
echo "$zeile" | ...
...
}
done

Das funktioniert zwar, ist aber ziemlich langsam. Weiß jemand,
woran das liegt, und wie man das verbessern könnte?



Eine Schleife in der Shell ist an sich schon langsam. In der Schleife
dann noch zwei Prozesse pro Zeile zu erzeugen ist furchtbar. Die Lösung
besteht darin, die Schleife aus der Shell rauszuziehen. Dafür eignen
sich perl, awk oder sed.

Mit GNU sed sieht das so aus:

sed -ne "h; s/[[:blank:]]//g; /$1/I { g; p }" telefon.dat

Wenn dein sed die Option "I" (für case insensitive) nicht hat,
kannst du das mit y/A-Z/a-z/ annàhernd ersetzen.

Ähnliche fragen