LPIC101/103.7 Regulären Ausdrücke: Unterschied zwischen den Versionen

Aus Foxwiki
Benhoffmann (Diskussion | Beiträge)
K Textersetzung - „Man-Pages“ durch „Man-Page“
 
(70 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Wichtung : 3
'''LPIC101/103.7''' - Textdateien mit regulären Ausdrücken durchsuchen
== Beschreibung ==
; Gewichtung 3


==Begriffs- und Zeichenklärung==
=== Begriffs- und Zeichenklärung ===
; Was sind reguläre Ausdrücke?
* Reguläre Ausdrücke erleichtern das durchsuchen von Texten
* Sie beschreiben anhand von Wildcards, Suchwörtern und Positionsangaben und ermöglichen so eine differenziertere Suche
* Wildcards werden auch Jokerzeichen genannt und sind Platzhalter für ein oder mehrere Zeichen
* Reguläre Ausdrücke werden in englisch Regular Expressions genannt
* Reguläre Ausdrücke werden meist mit RegEx oder RegExp abgekürzt


'''Was sind reguläre Ausdrücke?'''
; Wo werden reguläre Ausdrücke verwendet?
*Reguläre Ausdrücke erleichtern das durchsuchen von Texten
{| class="wikitable"
*Sie beschreiben anhand von Wildcards, Suchwörtern und Positionsangaben und ermöglichen so eine differenziertere Suche
! Verwendung !! Beschreibung
*Wildcards werden auch Jokerzeichen genannt und sind Platzhalter für ein oder mehrere Zeichen
|-
*Reguläre Ausdrücke werden in englisch Regular Expressions genannt
| Programmiersprachen || Alle
*Reguläre Ausdrücke werden meist mit RegEx oder RegExp abgekürzt
|-
| Shell || [[grep]], [[find]], [[vim|vi(m)]], [[sed]], [[awk]], ...
|-
| GUI || [[kate|Kate Editor]], [[Libreoffice]], ...
|}


'''Wo kann man reguläre Ausdrücke verwenden?'''
=== Metazeichen ===
*Mit dem Filter "grep" in der Shell
; Anker
*Mit dem Vi-Editor in der Shell
Anker beschreiben die Position einer Suchanfrage
*Mit dem sed Editor in der Shell
{| class="wikitable options"
*Im Kate Editor (Option {} aktivieren im Suchen Fenster)
|-
*In vielen weiteren Programmen
! Anker !! Beschreibung
|-
| <code>^</code> || Textanker für Zeilenanfang
|-
| <code>$</code> || Textanker für Zeilenende
|-
| <code>\<</code> || markiert einen Wortanfang
|-
| <code>\></code> || markiert ein Wortende
|}


===Gültige Metazeichen===
Es können auch Zeichen und Zeichensätze angegeben werden, nach denen gesucht werden soll
{| class="wikitable options"
|-
! Zeichen !! Beschreibung
|-
| <code>\</code> || schützt ein Zeichen vor der Interpretation (z.&nbsp;B.&nbsp;\$ sucht nach Dollarzeichen und nimmt diesen seine Spezialbedeutung)
|-
| <code>[]</code> || sucht nach einem Zeichen oder einer Zeichenfolge innerhalb des eckig geklammerten Bereichs (z.&nbsp;B.&nbsp;[a-g] )
|-
| <code>[^Zeichen]</code> || Schließt das Zeichen nach dem Circonflex aus der Suche aus
|}


Metazeichen beschreiben die Position einer Suchanfrage. Sie könen auch Zeichen und Zeichensätze definieren, nach denen gesucht werden soll. Gültige Metazeichen sind :
=== Quantoren ===
Wildcards (Joker/Quantoren) beschreiben vorgehende und nachfolgende Zeichen


* <code>^</code> Textanker für Zeilenanfang
{| class="wikitable options col1center"
* <code>$</code> Textanker für Zeilenende
|-
* <code>\<</code> markiert einen Wortanfang
! Quantor !! Beschreibung
* <code>\></code> markiert ein Wortende
|-
* <code>\</code> schützt ein Zeichen vor der Interpretation (z.B. /$ sucht nach Dollarzeichen und nimmt diesen seine Spezialbedeutung)
| . || Ein beliebiges Zeichen
* <code>[]</code> sucht nach einem Zeichen oder einer Zeichenfolge innerhalb des eckig geklammerten Bereichs (z.B. [a-g] )
|-
* <code>[^Zeichen]</code> Schließt das Zeichen nach dem Circonflex aus der Suche aus
| * || Beliebig des vorangegangenen Zeichens
|-
| ? || Keine oder eine Wiederholung des vorangegangenen Zeichens
|-
| + || Mindestens eine Wiederholung des vorangegangenen Zeichens
|}


===Wildcards (Joker)===
== Anwendung ==
Wildcards beschreiben vorgehende und nachfolgende Zeichen.
=== GREP ===
; Verwendung von grep mit regulären Ausdrücken
Der Filter grep bedeutet "Global search for Regular Expressions and Print out" (Sinngemäß: Globale Suche durch Reguläre Ausdrücke mit Ausgabe).


* <code>*</code> bezeichnet keine oder beliebig viele Wiederholungen des vorangegangenen Zeichens
; Hinweise
* <code>?</code> bezeichnet keine oder eine Wiederholung des vorangegangenen Zeichens
:* <code>-v</code> ist bei grep nicht verbose (Gesprächigkeit), sondern invertiert die Ausgabe (z.&nbsp;B.&nbsp;grep -v "Testwort" zeigt alle Zeilen ohne Testwort)
* <code>+</code> bezeichnet, dass das voranstehende Zeichen mindestens einmal vorkommt
:* <code>-E</code> aktiviert erweiterte reguläre Ausdrücke (entspricht dem Befehl egrep)
* <code>.</code> wird als Platzhalter für ein beliebiges Zeichen verwendet
:* <code>-i</code> ignoriert Groß- & Kleinschreibung


==Verwendung von grep mit regulären Ausdrücken==
==== Beispiele ====
* Der Filter grep bedeutet "Global search for Regular Expressions and Print out" (Sinngemäß: Globale Suche durch Reguläre Ausdrücke mit Ausgabe).
<syntaxhighlight lang="bash" highlight="1" line>
grep [Ww]ill[iy] Adressliste
</syntaxhighlight>


'''Hinweise für die Verwendung von grep:'''
sucht in der Datei Adressliste nach Willi,willi,Willy und willy. (grep -i Will[iy] liefert das gleiche Ergebnis, ignoriert jedoch auch die Groß- & Kleinschreibung von den anderen Buchstaben)
* <code>-v</code> ist bei grep nicht verbose (Gesprächigkeit), sondern invertiert die Ausgabe (z.B. grep -v "Testwort" zeigt alle Zeilen ohne Testwort)
* <code>-E</code> aktiviert erweiterte reguläre Ausdrücke (entspricht dem Befehl egrep)
* <code>-i</code> ignoriert Groß- & Kleinschreibung


===Beispiele für Verwendung von grep mit RegEx===
<syntaxhighlight lang="bash" highlight="1" line>
* <code>archangel:~ # grep [Ww]ill[iy] Adressliste</code> – sucht in der Datei Adressliste nach Willi,willi,Willy und willy. (grep -i Will[iy] liefert das gleiche Ergebnis, ignoriert jedoch auch die Groß- & Kleinschreibung von den anderen Buchstaben)
grep W.lly Adressliste
* <code>archangel:~ # grep W.lly Adressliste</code> – der Punkt ersetzt ein beliebiges Zeichen, somit würden Willy, Wally usw. gefunden werden, sofern diese existieren.
</syntaxhighlight>
* <code>archangel:~ # grep -v ^[#] /etc/config.conf</code>oder Alternativ <code>archangel:~ # grep ^[^#] /etc/config.conf</code> – findet alle Zeilenanfänge, welche nicht mit einer Raute beginnen
* <code>archangel:~ # grep ^[^#] /etc/config.conf | grep -v ^$</code> – Sucht alle Zeilenanfänge ohne Raute und mit Zeichen am Anfang (siebt Leerzeilen aus, Leerzeile ist Zeilenanfang ^ gefolgt von Zeilenende $)
* <code>archangel:~ # grep 'Wort[1-9]*\>' Suchdatei</code> – Sucht alle Wörter, welche mit "Wort" anfangen und anschließend beliebig viele Zahlen bis zum Wortende beinhalten.
* <code>archangel:~ # grep 'Wort[1-9]\?\>' Suchdatei</code> – Sucht alle Wörter, welche mit "Wort" anfangen und anschließend eine beliebige einstellige Zahl bis zum Wortende beinhalten.
* <code>archangel:~ # grep -w '1\{3,5\}' Suchdatei</code> – Mit  dem  folgenden  Kommando  werden  alle  Zeilen  einer  Datei  angezeigt,  die  drei, vier oder fünf aufeinander folgende Einsen enthalten.


===Schutz von Metazeichen===
der Punkt ersetzt ein beliebiges Zeichen, somit würden Willy, Wally usw. gefunden werden, sofern diese existieren.
 
<syntaxhighlight lang="bash" highlight="1" line>
grep -v ^[#] /etc/config.confoder Alternativ grep ^[^#] /etc/config.conf
</syntaxhighlight>
 
findet alle Zeilenanfänge, welche nicht mit einer Raute beginnen
 
<syntaxhighlight lang="bash" highlight="1" line>
grep ^[^#] /etc/config.conf | grep -v ^$
</syntaxhighlight>
 
Sucht alle Zeilenanfänge ohne Raute und mit Zeichen am Anfang (siebt Leerzeilen aus, Leerzeile ist Zeilenanfang ^ gefolgt von Zeilenende $)
 
<syntaxhighlight lang="bash" highlight="1" line>
grep 'Wort[1-9]*\>' Suchdatei
</syntaxhighlight>
 
Sucht alle Wörter, welche mit "Wort" anfangen und anschließend beliebig viele Zahlen bis zum Wortende beinhalten.
 
<syntaxhighlight lang="bash" highlight="1" line>
grep 'Wort[1-9]\?\>' Suchdatei
</syntaxhighlight>
 
Sucht alle Wörter, welche mit "Wort" anfangen und anschließend eine beliebige einstellige Zahl bis zum Wortende beinhalten.
 
<syntaxhighlight lang="bash" highlight="1" line>
grep -w '1\{3,5\}' Suchdatei
</syntaxhighlight>
 
Mit  dem  folgenden  Kommando  werden  alle  Zeilen  einer  Datei  angezeigt,  die  drei, vier oder fünf aufeinander folgende Einsen enthalten.
 
====Schutz von Metazeichen====
Einige Metazeichen müssen durch einen Backslash geschützt werden, damit grep diese nicht als Suchmusterbestandteil versteht.
Einige Metazeichen müssen durch einen Backslash geschützt werden, damit grep diese nicht als Suchmusterbestandteil versteht.


Zeile 67: Zeile 132:
</code>
</code>


==egrep und fgrep==
==== egrep und fgrep ====
Ursprünglich eigenständige Filter, werden diese beiden Varianten heute kaum noch verwendet. Sie sind in grep mit dem Optionen -E und -F enthalten. egrep hat erweiterte Funktionen (benötigt daher etwas länger zum Suchen), fgrep verzichtet auf Metazeichen und spart somit Zeit und Rechenleistung.
Ursprünglich eigenständige Filter, werden diese beiden Varianten heute kaum noch verwendet. Sie sind in grep mit dem Optionen -E und -F enthalten. egrep hat erweiterte Funktionen (benötigt daher etwas länger zum Suchen), fgrep verzichtet auf Metazeichen und spart somit Zeit und Rechenleistung.


==Der Streamlineeditor sed==
=== SED ===
; Der Streamlineeditor sed
Der Editor sed arbeitet mit Strömen. Er liest in seiner puren Form StdIn (Kanal 0) und gibt in StdOut (Kanal 1) aus, ähnlich dem Befehl cat. Um das Ergebnis zu speichern muss man eine extra Zieldatei angeben. Quelle und Ziel dürfen nicht identisch sein.
Der Editor sed arbeitet mit Strömen. Er liest in seiner puren Form StdIn (Kanal 0) und gibt in StdOut (Kanal 1) aus, ähnlich dem Befehl cat. Um das Ergebnis zu speichern muss man eine extra Zieldatei angeben. Quelle und Ziel dürfen nicht identisch sein.


===Wichtige Kommandos und Optionen===
==== Kommandos und Optionen ====
 
* <code>-e Kommando</code> – Kündigt ein Kommando an. Dies ist nur nötig, wenn mehrere Kommandos aufeinander folgen sollen.
* <code>-e Kommando</code> – Kündigt ein Kommando an. Dies ist nur nötig, wenn mehrere Kommandos aufeinander folgen sollen.
* <code>-f Scriptdatei</code> – Lädt mehrere Kommandos aus einem Script. Besonders praktisch, wenn eine bestimmte Kommandoroutine mehrmals aufgerufen werden soll.
* <code>-f Scriptdatei</code> – Lädt mehrere Kommandos aus einem Script. Besonders praktisch, wenn eine bestimmte Kommandoroutine mehrmals aufgerufen werden soll.
* <code>-g</code> – sed sucht normalerweise nur innerhalb einer Zeile. Die Option g setzt das Suchverhalten auf global und lässt sed somit auch nach einem Fund weitersuchen.
* <code>-g</code> – sed sucht normalerweise nur innerhalb einer Zeile. Die Option g setzt das Suchverhalten auf global und lässt sed somit auch nach einem Fund weitersuchen.


===Adressierung mit sed===
====Adressierung mit sed====
 
Der Editor sed sucht und bearbeitet Zeilen innerhalb einer Datei. Manchmal ist es nötig den Arbeitsbereich einzuschränken. Dies kann auf drei Arten geschehen :  
Der Editor sed sucht und bearbeitet Zeilen innerhalb einer Datei. Manchmal ist es nötig den Arbeitsbereich einzuschränken. Dies kann auf drei Arten geschehen :  
1. Angabe von Zeilennummern
1. Angabe von Zeilennummern
Zeile 88: Zeile 152:
Wird keine Adressierung vorgenommen so bearbeitrt sed die gesamte Datei.
Wird keine Adressierung vorgenommen so bearbeitrt sed die gesamte Datei.


===Beispiele für das Arbeiten mit sed===
====Beispiele für das Arbeiten mit sed====
 
sed kann mit dem Kommando "y" ähnlich wie translate (Siehe 103.2) einzelne Zeichen suchen und ersetzen. Im Gegensatz zu translate kann sed die Änderungen jedoch in einer neuen Datei abspeichern. Dabei kann für jedes Zeichen nur ein Zeichen ersetzt werden, keine Zeichenkette (1:1 Beziehung).
sed kann mit dem Kommando "y" ähnlich wie translate (Siehe 103.2) einzelne Zeichen suchen und ersetzen. Im Gegensatz zu translate kann sed die Änderungen jedoch in einer neuen Datei abspeichern. Dabei kann für jedes Zeichen nur ein Zeichen ersetzt werden, keine Zeichenkette (1:1 Beziehung).


In dem folgenden Beispiel wird ein Komma mit einem Semikolon ersetzt.
In dem folgenden Beispiel wird ein Komma mit einem Semikolon ersetzt.
<code>archangel:~ # sed 'y/,/;/' Kommadatei > Semikolondatei</code>
<code># sed 'y/,/;/' Kommadatei > Semikolondatei</code>


* <code>archangel:~ # sed -e '/^$/d' -e '/^#/d' /etc/config.conf</code> – Das -e leitet jeweils ein Kommando ein. Die RegEx müssen innerhalb von Slashes stehen. Der Befehl "d" löscht das Suchergebnis. "/^$/" sucht von Zeilenanfang bis Zeilenenede. "/^#/" sucht Rauten am Zeilenanfang. Somit werden bei diesem Befehl Kommentarspalten und Leerzeilen gelöscht.
* <code># sed -e '/^$/d' -e '/^#/d' /etc/config.conf</code> – Das -e leitet jeweils ein Kommando ein. Die RegEx müssen innerhalb von Slashes stehen. Der Befehl "d" löscht das Suchergebnis. "/^$/" sucht von Zeilenanfang bis Zeilenenede. "/^#/" sucht Rauten am Zeilenanfang. Somit werden bei diesem Befehl Kommentarspalten und Leerzeilen gelöscht.
* <code>archangel:~ # sed '25,47d' Originaldatei > Kurzdatei</code> – In diesem Befehl wird zur Adressierung die Zeilenangabe verwendet. Es werden also Zeile 25 und 47 gelöscht. Das Kommando kann durch ein "!" invertiert werden ("25,45!d").
* <code># sed '25,47d' Originaldatei > Kurzdatei</code> – In diesem Befehl wird zur Adressierung die Zeilenangabe verwendet. Es werden also Zeile 25 und 47 gelöscht. Das Kommando kann durch ein "!" invertiert werden ("25,45!d").


* <code>archangel:/textfiles # sed 's/ue/ü/' Namensliste </code> – Das Kommando s substituiert Zeichen. Es ist leistungsfähiger als y, da es ein Zeichen auch durch eine Zeichenkette ersetzen kann und umgekehrt. In diesem Beispiel wird ein "ue" mit einem "ü" ersetzt. Mit diesem Befehl wird allerdings lediglich der erste gefundene String mit "ue" durch "ü" ersetzt. Durch das setzen der globalen Option "g" werden alle "ue"'s im Text mit "ü" ersetzt : <code>archangel:/textfiles # sed 's/ue/ü/g' Namensliste</code>
* <code>archangel:/textfiles # sed 's/ue/ü/' Namensliste </code> – Das Kommando s substituiert Zeichen. Es ist leistungsfähiger als y, da es ein Zeichen auch durch eine Zeichenkette ersetzen kann und umgekehrt. In diesem Beispiel wird ein "ue" mit einem "ü" ersetzt. Mit diesem Befehl wird allerdings lediglich der erste gefundene String mit "ue" durch "ü" ersetzt. Durch das setzen der globalen Option "g" werden alle "ue"'s im Text mit "ü" ersetzt : <code>archangel:/textfiles # sed 's/ue/ü/g' Namensliste</code>


===Skripte in sed===
====Skripte in sed====
Man kann mitels Skripten eine Befehlskette durch sed ausführen lassen.
Man kann mitels Skripten eine Befehlskette durch sed ausführen lassen.
In dem folgenden Beispiel werden Umlaute (Ä,ä,Ü,ü,Ö,ö und ß) mit HTML tauglichen Zeichenketten ersetzt ("Ä" ist beispielsweise in HTML "&Auml;"). Das Skript wird mit cat (siehe 103.2) erstellt und heisst sedskript :
In dem folgenden Beispiel werden Umlaute (Ä,ä,Ü,ü,Ö,ö und ß) mit HTML tauglichen Zeichenketten ersetzt ("Ä" ist beispielsweise in HTML "&Auml;"). Das Skript wird mit cat (siehe 103.2) erstellt und heisst sedskript :
 
# cat sedskript  
<code>
s/ä/\&auml\;/g;
archangel:~ # cat sedskript <br>
s/Ä/\&Auml\;/g;
s/ä/\&auml\;/g;<br>
s/ü/\&uuml\;/g;
s/Ä/\&Auml\;/g;<br>
s/Ü/\&Uuml\;/g;
s/ü/\&uuml\;/g;<br>
s/ö/\&ouml\;/g;
s/Ü/\&Uuml\;/g;<br>
s/Ö/\&Ouml\;/g;
s/ö/\&ouml\;/g;<br>
s/ß/\&szlig\;/g;
s/Ö/\&Ouml\;/g;<br>
s/ß/\&szlig\;/g;<br>
</code>


Anschließend kann das Skript mit der Option -f eingelesen werden. Es müssen nun lediglich Quell- & Zieldatei angegeben werden und die Befehle in dem Skript werden auf die Quelldatei angewandt.
Anschließend kann das Skript mit der Option -f eingelesen werden. Es müssen nun lediglich Quell- & Zieldatei angegeben werden und die Befehle in dem Skript werden auf die Quelldatei angewandt.
# sed -f sedskript Quelltext-mit-Umlauten > Zieltext-in-HTML-Format


<code> archangel:~ # sed -f sedskript Quelltext-mit-Umlauten > Zieltext-in-HTML-Format</code>
<noinclude>
 
==Kontrollfragen==
<div class="toccolours mw-collapsible mw-collapsed">
Wonach sucht RegEx <code>^[^#]</code>
<div class="mw-collapsible-content">Antwort : Nach einem Zeilenanfang ohne Raute</div>
</div>
 
<div class="toccolours mw-collapsible mw-collapsed">
 
Sie geben im Kate Editor unter Suchen ohne RegExp "a*" ein. Was erhalten Sie als Antwort?
<div class="mw-collapsible-content">
Antwort : Sie suchen nach dem String "a*".</div>
</div>
 
<div class="toccolours mw-collapsible mw-collapsed">
 
Sie geben in der Kate-Suche mit RegEx a* ein, was erhalten Sie als Antwort?
<div class="mw-collapsible-content">
Antwort: Sie erhalten alle Wörter, welche mit einem a beginnen und eine bis beliebig viele Wiederholungen dieses Zeichens aufweisen.</div>
</div>
 
<div class="toccolours mw-collapsible mw-collapsed">
 
Sie geben in der Shell den Befehl ls a* ein, was erhalten Sie als Antwort?
<div class="mw-collapsible-content">
Antwort: Sie erhalten alle Dateien und Verzeichnisse, welche mit a beginnen und deren Folgezeichen belibieg sein können.</div>
</div>
 
<div class="toccolours mw-collapsible mw-collapsed">
Sie geben in der Shell den Befehl ls a??? ein, was erhalten Sie als Antwort?
<div class="mw-collapsible-content">
Antwort: Sie erhalten alle Dateien und Verzeichnisse, deren Name mit a beginnt und anschließend genau drei beliebige Folgezeichen beinhaltet.</div>
</div>
 
<div class="toccolours mw-collapsible mw-collapsed">
 
Wie können Sie sich alle Einträge vom 10ten Dezember im Systemlog ansehen?
<div class="mw-collapsible-content">
Antwort : archangel:~ # grep '^Dec 10' /var/log/syslog</div>
</div>
 
<div class="toccolours mw-collapsible mw-collapsed">
 
Wonach sucht das folgende RegEx Kommando : archangel:~ # grep –w '[0-9]\{3\}' Suchdatei ?
<div class="mw-collapsible-content">
Antwort: Es sucht nach Zeilen, die drei aufeinander folgende Ziffern beinhalten.</div>
</div>
 
<div class="toccolours mw-collapsible mw-collapsed">
 
Wonach sucht das folgende RegExp Kommando : archangel:~ # grep '[A-Z]\+' Suchdatei ?
<div class="mw-collapsible-content">
Antwort: Es sucht nach Zeilen mit mindestens einem Großbuchstaben.</div>
</div>


<div class="toccolours mw-collapsible mw-collapsed">
== Anhang ==
Was bewirkt folgender Befehl <code>archangel:/textfiles # sed 's/ae/ä/' DeutscherText.txt</code> ? <div class="mw-collapsible-content">Antwort: Er ersetzt alle "ae" Strings mit einem "ä".</div>
=== Siehe auch ===
</div>
{{Special:PrefixIndex/{{BASEPAGENAME}}}}
==== Dokumentation ====


===== Man-Page =====
===== Info-Pages =====
==== Links ====
===== Weblinks =====


[[Kategorie:Linux/LPIC/101]]
[[Kategorie:Linux/Logging]]
[[Kategorie:Regular Expression]]


[[Category:Linux]]
</noinclude>
[[Category:Linux:LPIC:101]]

Aktuelle Version vom 6. November 2024, 12:33 Uhr

LPIC101/103.7 - Textdateien mit regulären Ausdrücken durchsuchen

Beschreibung

Gewichtung 3

Begriffs- und Zeichenklärung

Was sind reguläre Ausdrücke?
  • Reguläre Ausdrücke erleichtern das durchsuchen von Texten
  • Sie beschreiben anhand von Wildcards, Suchwörtern und Positionsangaben und ermöglichen so eine differenziertere Suche
  • Wildcards werden auch Jokerzeichen genannt und sind Platzhalter für ein oder mehrere Zeichen
  • Reguläre Ausdrücke werden in englisch Regular Expressions genannt
  • Reguläre Ausdrücke werden meist mit RegEx oder RegExp abgekürzt
Wo werden reguläre Ausdrücke verwendet?
Verwendung Beschreibung
Programmiersprachen Alle
Shell grep, find, vi(m), sed, awk, ...
GUI Kate Editor, Libreoffice, ...

Metazeichen

Anker

Anker beschreiben die Position einer Suchanfrage

Anker Beschreibung
^ Textanker für Zeilenanfang
$ Textanker für Zeilenende
\< markiert einen Wortanfang
\> markiert ein Wortende

Es können auch Zeichen und Zeichensätze angegeben werden, nach denen gesucht werden soll

Zeichen Beschreibung
\ schützt ein Zeichen vor der Interpretation (z. B. \$ sucht nach Dollarzeichen und nimmt diesen seine Spezialbedeutung)
[] sucht nach einem Zeichen oder einer Zeichenfolge innerhalb des eckig geklammerten Bereichs (z. B. [a-g] )
[^Zeichen] Schließt das Zeichen nach dem Circonflex aus der Suche aus

Quantoren

Wildcards (Joker/Quantoren) beschreiben vorgehende und nachfolgende Zeichen

Quantor Beschreibung
. Ein beliebiges Zeichen
* Beliebig des vorangegangenen Zeichens
? Keine oder eine Wiederholung des vorangegangenen Zeichens
+ Mindestens eine Wiederholung des vorangegangenen Zeichens

Anwendung

GREP

Verwendung von grep mit regulären Ausdrücken

Der Filter grep bedeutet "Global search for Regular Expressions and Print out" (Sinngemäß: Globale Suche durch Reguläre Ausdrücke mit Ausgabe).

Hinweise
  • -v ist bei grep nicht verbose (Gesprächigkeit), sondern invertiert die Ausgabe (z. B. grep -v "Testwort" zeigt alle Zeilen ohne Testwort)
  • -E aktiviert erweiterte reguläre Ausdrücke (entspricht dem Befehl egrep)
  • -i ignoriert Groß- & Kleinschreibung

Beispiele

grep [Ww]ill[iy] Adressliste

sucht in der Datei Adressliste nach Willi,willi,Willy und willy. (grep -i Will[iy] liefert das gleiche Ergebnis, ignoriert jedoch auch die Groß- & Kleinschreibung von den anderen Buchstaben)

grep W.lly Adressliste

der Punkt ersetzt ein beliebiges Zeichen, somit würden Willy, Wally usw. gefunden werden, sofern diese existieren.

grep -v ^[#] /etc/config.confoder Alternativ grep ^[^#] /etc/config.conf

findet alle Zeilenanfänge, welche nicht mit einer Raute beginnen

grep ^[^#] /etc/config.conf | grep -v ^$

Sucht alle Zeilenanfänge ohne Raute und mit Zeichen am Anfang (siebt Leerzeilen aus, Leerzeile ist Zeilenanfang ^ gefolgt von Zeilenende $)

grep 'Wort[1-9]*\>' Suchdatei

Sucht alle Wörter, welche mit "Wort" anfangen und anschließend beliebig viele Zahlen bis zum Wortende beinhalten.

grep 'Wort[1-9]\?\>' Suchdatei

Sucht alle Wörter, welche mit "Wort" anfangen und anschließend eine beliebige einstellige Zahl bis zum Wortende beinhalten.

grep -w '1\{3,5\}' Suchdatei

Mit dem folgenden Kommando werden alle Zeilen einer Datei angezeigt, die drei, vier oder fünf aufeinander folgende Einsen enthalten.

Schutz von Metazeichen

Einige Metazeichen müssen durch einen Backslash geschützt werden, damit grep diese nicht als Suchmusterbestandteil versteht.

Diese Zeichen sind: ? + { } | ( )

egrep und fgrep

Ursprünglich eigenständige Filter, werden diese beiden Varianten heute kaum noch verwendet. Sie sind in grep mit dem Optionen -E und -F enthalten. egrep hat erweiterte Funktionen (benötigt daher etwas länger zum Suchen), fgrep verzichtet auf Metazeichen und spart somit Zeit und Rechenleistung.

SED

Der Streamlineeditor sed

Der Editor sed arbeitet mit Strömen. Er liest in seiner puren Form StdIn (Kanal 0) und gibt in StdOut (Kanal 1) aus, ähnlich dem Befehl cat. Um das Ergebnis zu speichern muss man eine extra Zieldatei angeben. Quelle und Ziel dürfen nicht identisch sein.

Kommandos und Optionen

  • -e Kommando – Kündigt ein Kommando an. Dies ist nur nötig, wenn mehrere Kommandos aufeinander folgen sollen.
  • -f Scriptdatei – Lädt mehrere Kommandos aus einem Script. Besonders praktisch, wenn eine bestimmte Kommandoroutine mehrmals aufgerufen werden soll.
  • -g – sed sucht normalerweise nur innerhalb einer Zeile. Die Option g setzt das Suchverhalten auf global und lässt sed somit auch nach einem Fund weitersuchen.

Adressierung mit sed

Der Editor sed sucht und bearbeitet Zeilen innerhalb einer Datei. Manchmal ist es nötig den Arbeitsbereich einzuschränken. Dies kann auf drei Arten geschehen : 1. Angabe von Zeilennummern 2. Verwendung des $ Zeichens für die Bearbeitung der letzten Zeile 3. Verwendung von regulären Ausdrücken (auf beiden Seiten mit Slashes begrenzt nach dem Muster /regEx/ )

Wird keine Adressierung vorgenommen so bearbeitrt sed die gesamte Datei.

Beispiele für das Arbeiten mit sed

sed kann mit dem Kommando "y" ähnlich wie translate (Siehe 103.2) einzelne Zeichen suchen und ersetzen. Im Gegensatz zu translate kann sed die Änderungen jedoch in einer neuen Datei abspeichern. Dabei kann für jedes Zeichen nur ein Zeichen ersetzt werden, keine Zeichenkette (1:1 Beziehung).

In dem folgenden Beispiel wird ein Komma mit einem Semikolon ersetzt. # sed 'y/,/;/' Kommadatei > Semikolondatei

  • # sed -e '/^$/d' -e '/^#/d' /etc/config.conf – Das -e leitet jeweils ein Kommando ein. Die RegEx müssen innerhalb von Slashes stehen. Der Befehl "d" löscht das Suchergebnis. "/^$/" sucht von Zeilenanfang bis Zeilenenede. "/^#/" sucht Rauten am Zeilenanfang. Somit werden bei diesem Befehl Kommentarspalten und Leerzeilen gelöscht.
  • # sed '25,47d' Originaldatei > Kurzdatei – In diesem Befehl wird zur Adressierung die Zeilenangabe verwendet. Es werden also Zeile 25 und 47 gelöscht. Das Kommando kann durch ein "!" invertiert werden ("25,45!d").
  • archangel:/textfiles # sed 's/ue/ü/' Namensliste – Das Kommando s substituiert Zeichen. Es ist leistungsfähiger als y, da es ein Zeichen auch durch eine Zeichenkette ersetzen kann und umgekehrt. In diesem Beispiel wird ein "ue" mit einem "ü" ersetzt. Mit diesem Befehl wird allerdings lediglich der erste gefundene String mit "ue" durch "ü" ersetzt. Durch das setzen der globalen Option "g" werden alle "ue"'s im Text mit "ü" ersetzt : archangel:/textfiles # sed 's/ue/ü/g' Namensliste

Skripte in sed

Man kann mitels Skripten eine Befehlskette durch sed ausführen lassen.

In dem folgenden Beispiel werden Umlaute (Ä,ä,Ü,ü,Ö,ö und ß) mit HTML tauglichen Zeichenketten ersetzt ("Ä" ist beispielsweise in HTML "Ä"). Das Skript wird mit cat (siehe 103.2) erstellt und heisst sedskript :

# cat sedskript 
s/ä/\&auml\;/g;
s/Ä/\&Auml\;/g;
s/ü/\&uuml\;/g;
s/Ü/\&Uuml\;/g;
s/ö/\&ouml\;/g;
s/Ö/\&Ouml\;/g;
s/ß/\&szlig\;/g;

Anschließend kann das Skript mit der Option -f eingelesen werden. Es müssen nun lediglich Quell- & Zieldatei angegeben werden und die Befehle in dem Skript werden auf die Quelldatei angewandt.

# sed -f sedskript Quelltext-mit-Umlauten > Zieltext-in-HTML-Format


Anhang

Siehe auch

Dokumentation

Man-Page
Info-Pages

Links

Weblinks