DieterH
24-07-2007, 09:09
SuSE Linux 10.2
„bash“
Ich möchte nach Fundstellen in einer Textdatei (ASCII Text; im Beispiel unten durch echo "Hallo" ersetzt) suchen und sie für einen späteren Arbeitsschritt mit zusätzlichen Informationen versehen. Die Fundstellen sind hauptsächlich Zeichenketten, bestehend aus Ziffern, Kommata und einem Nummernbereich (Beispiel: 12, 3 – 4), denen noch ein alfanumerischer Text wie z.B. „Kap.“ vorangestellt ist.
Ersetzung (verkürzt) mit:
echo "Hallo" | sed -e 's/[1-7]\. Text Kap\. [0-9]\{1,2\}, *[0-9 \-][0-9 \-]*/YYB{%%&}{__&___:000:___}/g'
funktioniert problemlos und syntaktisch fehlerfrei. „YYB ist eine Zeichenkette, an der ich später einhake. Für die spätere Weiterverarbeitung brauche ich die Fundstelle 2x, daher auch die beiden „&“ im Ersetzteil. Dass sie in jeweils in {} stehen, ist für die Nachbearbeitung bedeutend, auf mein Problem haben sie keinen Einfluss.
Ich möchte die obige sed-Anweisung formalisieren und sie in „Bausteintechnik“ formulieren, da sie mehrere 100x vorkommt, allerdings in Varianten. Zu diesem Zweck definiere ich die „Bausteine“:
PAT1="[CK]ap\. "
PAT2="[0-9]\{1,2\}, *[0-9 \-][0-9 \-]*"
YYB0="YYB{%%&}{__&___:000:___}"
#
Man beachte das Leerzeichen am Ende der Zeichenkette von ${PAT1}, und die Leerzeichen innerhalb von ${PAT2}. Sie sind notwendig, da die Fundstellen Leerzeichen aufweisen. Die angedeuteten Varianten wären in PATn (n = 3, ...) realisiert.
Mit diesen beiden Variablen schreibe ich die obige sed-Anweisung um in:
echo "Hallo" | sed -e 's/[1-7]\. Text '${PAT1}${PAT2}'/'${YYB0}/g'
Bei der Ausführung (mit sh -x) erhalte ich eine Fehlermeldung:
+ echo Hallo
+ sed -e 's/[1-7]\. Text [CK]ap\.' '[0-9]\{1,2\},' '*[0-9' '\-][0-9' '\-]*/YYB{%%&}{__&___:000:___}/g'
sed: -e Ausdruck #1, Zeichen 23: unterminated `s' command
Die Bash setzt um die in ${PAT1} und ${PAT2} enthaltenen Leerzeichen jeweils einen Apostroph, der wiederum das Begrenzungszeichen des mit -e eingeleiteten sed-Ausdrucks ist. Das kann nicht gut gehen.
Entferne ich die Leerzeichen aus ${PAT1} und ${PAT2}, funktioniert die sed-Anweisung. Wie gesagt, die Leerzeichen kommen aber in den Fundstellen vor.
Wie kann ich die „Bausteintechnik“ einsetzen, ohne dass ich Probleme wie das aufgezeigte bekomme?
Danke
Gruß
Dieter
„bash“
Ich möchte nach Fundstellen in einer Textdatei (ASCII Text; im Beispiel unten durch echo "Hallo" ersetzt) suchen und sie für einen späteren Arbeitsschritt mit zusätzlichen Informationen versehen. Die Fundstellen sind hauptsächlich Zeichenketten, bestehend aus Ziffern, Kommata und einem Nummernbereich (Beispiel: 12, 3 – 4), denen noch ein alfanumerischer Text wie z.B. „Kap.“ vorangestellt ist.
Ersetzung (verkürzt) mit:
echo "Hallo" | sed -e 's/[1-7]\. Text Kap\. [0-9]\{1,2\}, *[0-9 \-][0-9 \-]*/YYB{%%&}{__&___:000:___}/g'
funktioniert problemlos und syntaktisch fehlerfrei. „YYB ist eine Zeichenkette, an der ich später einhake. Für die spätere Weiterverarbeitung brauche ich die Fundstelle 2x, daher auch die beiden „&“ im Ersetzteil. Dass sie in jeweils in {} stehen, ist für die Nachbearbeitung bedeutend, auf mein Problem haben sie keinen Einfluss.
Ich möchte die obige sed-Anweisung formalisieren und sie in „Bausteintechnik“ formulieren, da sie mehrere 100x vorkommt, allerdings in Varianten. Zu diesem Zweck definiere ich die „Bausteine“:
PAT1="[CK]ap\. "
PAT2="[0-9]\{1,2\}, *[0-9 \-][0-9 \-]*"
YYB0="YYB{%%&}{__&___:000:___}"
#
Man beachte das Leerzeichen am Ende der Zeichenkette von ${PAT1}, und die Leerzeichen innerhalb von ${PAT2}. Sie sind notwendig, da die Fundstellen Leerzeichen aufweisen. Die angedeuteten Varianten wären in PATn (n = 3, ...) realisiert.
Mit diesen beiden Variablen schreibe ich die obige sed-Anweisung um in:
echo "Hallo" | sed -e 's/[1-7]\. Text '${PAT1}${PAT2}'/'${YYB0}/g'
Bei der Ausführung (mit sh -x) erhalte ich eine Fehlermeldung:
+ echo Hallo
+ sed -e 's/[1-7]\. Text [CK]ap\.' '[0-9]\{1,2\},' '*[0-9' '\-][0-9' '\-]*/YYB{%%&}{__&___:000:___}/g'
sed: -e Ausdruck #1, Zeichen 23: unterminated `s' command
Die Bash setzt um die in ${PAT1} und ${PAT2} enthaltenen Leerzeichen jeweils einen Apostroph, der wiederum das Begrenzungszeichen des mit -e eingeleiteten sed-Ausdrucks ist. Das kann nicht gut gehen.
Entferne ich die Leerzeichen aus ${PAT1} und ${PAT2}, funktioniert die sed-Anweisung. Wie gesagt, die Leerzeichen kommen aber in den Fundstellen vor.
Wie kann ich die „Bausteintechnik“ einsetzen, ohne dass ich Probleme wie das aufgezeigte bekomme?
Danke
Gruß
Dieter