Frage

Die sed Handbuch eindeutig fest, dass die zur Verfügung stehenden Rückreferenzierungen für das Ersatz-String in einem Ersatz nummeriert sind \ 1 bis \ 9. Ich versuche, eine Protokolldatei zu analysieren, die 10 Felder hat.

Ich habe die Regex für sie gebildet, aber das zehnte Spiel (und etwas nach) nicht zugänglich.

Hat jemand eine elegante Art und Weise haben diese Einschränkung in KSH zu umgehen (oder eine beliebige Sprache, die vielleicht kann ich Port-Scripting, Shell)?

War es hilfreich?

Lösung

Sie können die Benutzer perl -pe 's/(match)(str)/$2$1/g;' anstelle von sed? Die Art und Weise der Rückreferenzierung Grenze zu umgehen, ist etwas anderes als sed zu verwenden.

Auch ich nehme an, Sie Ihre Substitution in zwei Schritten tun könnten, aber ich weiß nicht, Ihr Muster so ich dir nicht helfen kann aus mit, wie.

Andere Tipps

Split der Strom mit -e, solange die ersetzten Elemente in der Gruppe sind, dass Sie teilen Sie sie mit. Als ich ein Datum Split tat so konnte ich wieder org die Datum-Zeit in eine Folge von 14 Ziffern, habe ich den Strom bis 3-mal teilen.

echo "created: 02/05/2013 16:14:49" |  sed -e 's/^\([[:alpha:]]*: \)//' -e 's/\([0-9]\{2\}\)\(\/\)\([0-9]\{2\}\)\(\/\)\([0-9]\{4\}\)\( \)/\5\1\3/' -e 's/\([0-9]\{2\}\)\(\:\)\([0-9]\{2\}\)\(\:\)\([0-9]\{2\}\)/\1\3\5/'

20130205161449

Sie fragen für ein Shell-Skript-Lösung - das bedeutet, dass Sie nicht beschränkt auf die Verwendung nur sed, richtig? Die meisten Shells unterstützt Arrays, so vielleicht können Sie die Zeile in ein Shell-Array-Variable analysieren? Wenn nötig, könnte man sogar die gleiche Linie mehrmals analysiert, bei jedem Durchlauf verschiedene Bits an Informationen zu extrahieren.

das tun würde?

Wenn Sie GNU awk haben, können Sie Dinge tun, mit viel mehr Kontrolle. Dazu würden Sie match(source,/regex/,array) Konstrukt werden müssen.

Beispiel:

Probeneingang für den Test:

 echo "$x"
p1=aaa,p2=bb,p3=cc,p4=dd,p5=ee,p6=ff,p7=gg,p8=hh,p9=ii,p10=jj

sed funktioniert gut bis \9:

echo $x |sed -r 's/p1=([^,]+).*p2=([^,]+).*p3=([^,]+).*p4=([^,]+).*p5=([^,]+).*p6=([^,]+).*p7=([^,]+).*p8=([^,]+).*p9=([^,]+)(.*)/\1 \2 \3 \4 \5 \6 \7 \8 \9/'
aaa bb cc dd ee ff gg hh ii

sed brach, als \10 hinzugefügt wird, berücksichtigt wird, ist \1 + 0.

echo $x |sed -r 's/p1=([^,]+).*p2=([^,]+).*p3=([^,]+).*p4=([^,]+).*p5=([^,]+).*p6=([^,]+).*p7=([^,]+).*p8=([^,]+).*p9=([^,]+).*p10=([^,]+)(.*)/\1 \2 \3 \4 \5 \6 \7 \8 \9 \10/'
aaa bb cc dd ee ff gg hh ii aaa0

awk auf Rettung, wenn ein Rückverweis hinzugefügt mehr als 9 angefügt. Hier 10. refrence angefügt:

echo "$x" |awk '{match($0,/p1=([^,]+).*p2=([^,]+).*p3=([^,]+).*p4=([^,]+).*p5=([^,]+).*p6=([^,]+).*p7=([^,]+).*p8=([^,]+).*p9=([^,]+).*p10=([^,]+)(.*)/,a);print a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10]}'
aaa bb cc dd ee ff gg hh ii jj

eine Lösung in Betracht, die nicht die Verwendung von regulären Ausdrücken Rückreferenzierungen erfordern. Zum Beispiel, wenn Sie ein einfaches Feldtrennzeichen, Verwendung split oder sogar Verwendung awk für Ihre statt Perl verarbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top