PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu "sed"



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

BLUESCREEN3D
24-07-2007, 14:51
echo "Hallo" | sed -e 's/[1-7]\. Text '${PAT1}${PAT2}'/'${YYB0}/g'

Da die Variablen Leerzeichen enthalten können sollen, müssen sie in Anführungsstrichen stehen.

Einfachste Möglichkeit:

echo "Hallo" | sed -e "s/[1-7]\. Text ${PAT1}${PAT2}/${YYB0}/g"

DieterH
24-07-2007, 20:45
Danke!

Gruß
Dieter