Marc Santhoff wrote:
> #!/bin/sh
>
> awk '{ gsub(/</, "\\<"); \
> gsub(/>/, "\\>"); \
> gsub(/&/, "\\&"); \
> gsub(/"/, "\\""); \
> gsub(/\'/, "\\'"); \
> print }' -
Da ist noch ein kleiner Fehler: Das "&" musst Du als
allererstes konvertieren. Sonst wird nämlich aus einem
">" zuerst ein ">" und in der nächsten Zeile sofort
ein "&gt;", was sicherlich nicht beabsichtigt ist.
In /bin/sh kann man kann doppelte und einfache Anführungs-
zeichen wie folgt in sich selbst quoten:
$ echo "foo\"bar"
"
$ echo 'foo'\''bar'
'
Die vorletzte Zeile in Deinem Skript müsste also so aussehen:
gsub(/'\''/, "\\'")
Übrigens, die Semikolons und Backslashes an den Zeilenenden
sind überflüssig (schaden aber nicht); awk akzeptiert ein
Newline als Kommandotrenner.
Falls das Shellskript außer dem awk-Kommando nichts weiter
enthält, dann brauchst Du gar keine /bin/sh, sondern
kannst es direkt als awk-Skript schreiben, womit Du die
Quoting-Problematik der Shell ganz vermeidest:
#!/usr/bin/awk -f
{
gsub(/&/, "\\&")
gsub(/</, "\\<")
gsub(/>/, "\\>")
gsub(/"/, "\\"")
gsub(/'/, "\\'")
print
}
Alternativ kannst Du ein sed-Skript nehmen, das etwa drei-
bis viermal schneller ist:
#!/usr/bin/sed -f
s/&/\&/g
s/</\</g
s/>/\>/g
s/"/\"/g
s/'/\'/g
Wo ich gerade dabei bin: Eine Lösung in Python ist nochmal
ein Drittel schneller, allerdings gehört Python nicht zum
Basissystem von FreeBSD, insofern ist es weniger portabel.
#!/usr/local/bin/python
from sys import stdin, stdout
t = stdin.read()
t = t.replace("&", "&")
t = t.replace("<", "<")
t = t.replace(">", ">")
t = t.replace('"', """)
t = t.replace("'", "'")
stdout.write(t)
(Den Geschwindigkeitsvergleich habe ich mit einer 25MB-Datei
gemacht, in der in ca. jeder fünften Zeile eine Ersetzung
gemacht werden musste.)
Gruß
Olli
-- Oliver Fromme, secnetix GmbH & Co. KG, Marktplatz 29, 85567 Grafing b. M. Handelsregister: Registergericht Muenchen, HRA 74606, Geschäftsfuehrung: secnetix Verwaltungsgesellsch. mbH, Handelsregister: Registergericht Mün- chen, HRB 125758, Geschäftsführer: Maik Bachmann, Olaf Erb, Ralf Gebhart FreeBSD-Dienstleistungen, -Produkte und mehr: http://www.secnetix.de/bsd "The last good thing written in C was Franz Schubert's Symphony number 9." -- Erwin Dieterich To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org with "unsubscribe de-bsd-questions" in the body of the messageReceived on Wed 14 Jan 2009 - 08:36:18 CET