Linux: Der Versuch, Out sed

Das folgende Beispiel unter Linux verwenden sed enthält Beispielzeilen eines Mitarbeiterdatenbank Kolon-begrenzt, die fünf Felder hat: eindeutige ID-Nummer, Name, Abteilung, Telefonnummer und Adresse.

1218: Kris Cottrell: Marketing: 219.555.5555: 123 Haupt Street1219: Nate Eichhorn: Umsatz: 219.555.5555: 1219 Locust Avenue1220: Joe Gunn: Kreditoren: 317.555.5555: 21974 Unix Way1221: Anne Heltzel: Finanzen: 219.555.5555: 652 Linux Road1222: John Kuzmic: Human Resources: 219.555.5555: 984 Bash Lane

Diese Datenbank hat sich seit Beginn des Unternehmens in Existenz gewesen und hat alle gewachsen sind, die jetzt arbeitet, oder je gearbeitet hat, für das Unternehmen. Eine Reihe von proprietären Skripten gelesen, aus der Datenbank, und das Unternehmen nicht leisten können, ohne es zu sein. Das Problem ist, dass die Telefongesellschaft den 219 bis 260-Präfix geändert hat, so dass alle Einträge in der Datenbank geändert werden müssen.

Genau dies ist die Aufgabe, für die sed erstellt wurde. Im Gegensatz zu standardisierten (interaktiv) Editoren, ein Stream-Editor bahnt sich seinen Weg durch eine Datei und macht Änderungen auf der Grundlage der Regeln es gegeben ist. Die Regel ist in diesem Fall 219 bis 260 zu ändern, ganz Es ist nicht so einfach, aber, weil, wenn Sie den Befehl

sed 's / 219/260 /'

das Ergebnis ist nicht vollständig, was Sie wollen (Änderungen in Fett gedruckt):

1218: Kris Cottrell: Marketing:260.555.5555: 123 Haupt Street1260: Nate Eichhorn: Umsatz: 219.555.5555: 1219 Locust Avenue1220: Joe Gunn: Kreditoren: 317.555.5555:26074 Unix Way1221: Anne Heltzel: Finanzen:260.555.5555: 652 Linux Road1222: John Kuzmic: Human Resources:260.555.5555: 984 Bash Lane

Die Änderungen in den ersten, vierten und fünften Zeilen korrekt sind. Aber in der zweiten Zeile das erste Vorkommen von 219 in der Anzahl Mitarbeiter-ID erscheint nicht in der Telefonnummer und wurde geändert, um 260. Wenn Sie als das erste Auftreten mehr ändern wollte in einer Linie, könnten Sie einen Klaps G (für global) In den Befehl ein:

sed 's / 219/260 / g'

Das ist nicht was Sie in diesem Fall tun wollen, aber, weil die Mitarbeiter-ID-Nummer nicht ändern sollte. Auch in der dritten Zeile, wurde eine Änderung an die Adresse, weil es den Wert enthält, der gesucht wird for- keine Änderung vorgenommen werden sollte, da der Mitarbeiter nicht die 219 Telefon-Vorwahl hat.

Die erste Regel der Verwendung sed ist zu erkennen, was die Position der Zeichenfolge macht Sie einzigartig suchen. Wenn das Telefon-Vorwahl in Klammern eingeschlossen ist, wäre es viel einfacher zu isolieren sein. In dieser Datenbank ist jedoch, dass nicht der Fall- die Aufgabe ein wenig komplizierter wird.

Wenn Sie sagte, dass die Telefon-Vorwahl am Anfang des Feldes erscheinen muss (durch einen Doppelpunkt bezeichnet), wäre das Ergebnis viel näher an, was Sie wollen:

sed 's / 219/260 /'

Auch hier hat bolding die Änderungen zu zeigen, wurden hinzugefügt:

1218: Kris Cottrell: Marketing:260.555.5555: 123 Haupt Street1219: Nate Eichhorn: Umsatz:260.555.5555: 1219 Locust Avenue1220: Joe Gunn: Kreditoren: 317.555.5555:26074 Unix Way1221: Anne Heltzel: Finanzen:260.555.5555: 652 Linux Road1222: John Kuzmic: Human Resources:260.555.5555: 984 Bash Lane

Die Genauigkeit wurde erhöht, aber es besteht immer noch das Problem der dritten Zeile. Da der Doppelpunkt den Beginn der Zeichenfolge zu identifizieren half, kann es verlockend sein, die Zeit, um das Ende zu identifizieren:

sed 's / 219 ./: 260./'

Aber das Ergebnis ist immer noch nicht, was erhofft (die dritte Zeile beachten):

1218: Kris Cottrell: Marketing:260.555.5555: 123 Haupt Street1219: Nate Eichhorn: Umsatz:260.555.5555: 1219 Locust Avenue1220: Joe Gunn: Kreditoren: 317.555.5555:260.4 Unix Way1221: Anne Heltzel: Finanzen:260.555.5555: 652 Linux Road1222: John Kuzmic: Human Resources:260.555.5555: 984 Bash Lane

Da die Zeit eine besondere Bedeutung von ein beliebiges Zeichen, eine Übereinstimmung gefunden wird, ob der 219 gefolgt von einem Punkt ist, wird eine 7 oder ein anderes Zeichen. Was auch immer der Charakter, wird er mit einem Punkt ersetzt. Der Ersatz-Seite der Dinge ist nicht die problem- die Suche gezwickt werden muss.

Durch die Verwendung der Zeichen können wir die besondere Bedeutung der Frist außer Kraft setzen und angeben, dass Sie in der Tat für einen Zeitraum suchen und nicht jedes einzelne Zeichen:

sed 's /: 219 ./: 260./'

Das Ergebnis wird zu:

1218: Kris Cottrell: Marketing:260.555.5555: 123 Haupt Street1219: Nate Eichhorn: Umsatz:260.555.5555: 1219 Locust Avenue1220: Joe Gunn: Kreditoren: 317.555.5555: 21974 Unix Way1221: Anne Heltzel: Finanzen:260.555.5555: 652 Linux Road1222: John Kuzmic: Human Resources:260.555.5555: 984 Bash Lane

Und die Mission erreicht wird.

Menü