sed - selektives Ersetzen

27/02/2011 - 19:47 von Michael Jaritz | Report spam
Hallo,
ich versuche *.xml mit gawk auszulesen. Mit FS=" ".
Leider kommen Zeilen wie z.B.
<foo bar1="a - b" bar2="x - y - z"/>
^ ^ ^ ^ ^ ^ Die Leerzeichen stören,
des wegen versuche ich diese zuerst mit sed zu beseitigen.

|$ echo "<foo bar1=\"a - b\" bar2=\"x - y - z\"/>" | sed -e 's/="\([^ "]*\)[ ]*\([^ "]*\)[ ]*\([^ "]*\)[ ]*\([^ "]*\)"/="\1\2\3\4"/g'
|<foo bar1="a-b" bar2="x - y - z"/>

Warum wirkt sed nur auf den Wert von bar1 und nicht bei bar2?

Könnte man sich durch ein sehr intelligentes Setzen von FS in awk
eventuell sed ersparen?

Es geht um GNU sed-Version 4.2.1 und GNU Awk 3.1.6 unter GNU bash,
Version 4.1.5(1)-release

Michael

np: The Flower Kings / Unfold The Future (1/2) - The Truth Will Set You Free
 

Lesen sie die antworten

#1 Paul Hink
27/02/2011 - 20:22 | Warnen spam
Michael Jaritz wrote:

ich versuche *.xml mit gawk auszulesen. Mit FS=" ".
Leider kommen Zeilen wie z.B.
<foo bar1="a - b" bar2="x - y - z"/>
^ ^ ^ ^ ^ ^ Die Leerzeichen stören,
des wegen versuche ich diese zuerst mit sed zu beseitigen.

|$ echo "<foo bar1=\"a - b\" bar2=\"x - y - z\"/>" | sed -e 's/="\([^ "]*\)[ ]*\([^ "]*\)[ ]*\([^ "]*\)[ ]*\([^ "]*\)"/="\1\2\3\4"/g'
|<foo bar1="a-b" bar2="x - y - z"/>

Warum wirkt sed nur auf den Wert von bar1 und nicht bei bar2?



Weil der Wert von bar2 ein "Element" zu viel aufweist. Die Regular
Expression passt auf maximal vier durch Whitespace getrennte Elemente
(\1 bis \4), der Wert von bar2 hat aber fünf derartige Elemente.
Ergànze ein weiteres [ ]*\([^ "]*\) und ein \5, dann funktioniert es.

Ähnliche fragen