2010-11-18 5 views
0

J'ai un fichier xml dont les lignes devraient ressembler à ceci:ETD supprimer l'espace entre les caractères

<item id=""><myname>FIRST NAME</myname><myurl>http://etc.com</myurl></item> 

Je peux facilement remplacer le " myurl=" ci-dessous pour faire le look de ligne comme celle-ci.

<item id=""><myname>FIRST NAME" myURL="http://etc.com</myurl></item> 

Malheureusement, la plupart d'entre eux se présentent comme suit, avec différentes quantités d'espace blanc dans b/t:

<item id=""><myname>FIRST NAME"     
     myURL="http://etc.com</myurl></item> 

Je ne peux pas sembler obtenir un travail ETD remplacer par des espaces en b/t caractères

+0

Votre XML malformé - est-ce intentionnel? –

+0

Non, désolé! Fixé. –

+0

Est-ce que le dernier a une nouvelle ligne ou est-il enveloppé en raison d'un grand nombre d'espaces? –

Répondre

0
sed '/myname>.*\"\s*$/N;s|\"\s*\n*\s*myURL=\"|</myname><myurl>|' file.xml 

Cette première teste si la ligne est incomplète. Si c'est le cas, il place la ligne suivante dans l'espace de motif. Dans les deux cas, il remplace le texte d'origine par le texte souhaité.

BTW, si quelqu'un peut me dire un moyen de faire correspondre une nouvelle ligne dans l'espace de motif dans un jeu de caractères, je l'apprécierais. Par exemple, [\s\n]* au lieu de \s*\n*\s* dans l'expression ci-dessus.

entrée

:

<item id=""><myname>FIRST NAME" myURL="http://etc.com</myurl></item> 
<item id=""><myname>FIRST NAME"     
     myURL="http://etc.com</myurl></item> 
<item id=""><myname>FIRST NAME" myURL="http://etc.com</myurl></item> 

sortie:

<item id=""><myname>FIRST NAME</myname><myurl>http://etc.com</myurl></item> 
<item id=""><myname>FIRST NAME</myname><myurl>http://etc.com</myurl></item> 
<item id=""><myname>FIRST NAME</myname><myurl>http://etc.com</myurl></item> 
1

Est-ce que regex 's/ */ /g' est ce que vous cherchez?

Pour toutes les chaînes de deux espaces ou plus, cela remplace un espace unique.

+1

C'est trois espaces entre la première barre oblique et l'astérisque (ce n'est pas facile à voir). –

+0

's/+// g'' (deux espaces entre la première barre oblique et le signe plus - la mise en évidence du code sur ce site semble fonctionner différemment pour les questions/réponses et les commentaires ...) devrait faire la même chose. Alors que '*' indique que le caractère précédent peut apparaître n'importe quand (y compris zéro), '+' signifie "un ou plusieurs". – David

+0

J'utilise aussi parfois 's/[\ t] +// g'', qui remplace un nombre quelconque d'espaces récurrents ou d'onglets par un seul espace. Attention cependant: Alors que 'sed -r' supporte généralement \ t, vous devez utiliser explicitement ** Perl regex ** pour' grep' en déclarant '-P'. – David

Questions connexes