Remplacez le texte par sed et conservez une partie du texte d'origine

20

J'essaye de convertir

<id>1</id>
<Name>ENTERPRISE RESOURCE PLANNING</Name>

à:

<column name="id">1</column>
<column name="Name">ENTERPRISE RESOURCE PLANNING</column>

Je suppose que le meilleur outil pour le travail serait sed, mais je ne peux pas comprendre comment conserver des parties du texte d'origine dans la pièce de remplacement.

Si je fais:

$ sed -i 's/<.*>.*<.*>/<column name="\\1">\\2<\/column>/g' filename.xml

La sortie est:

<column name="\1">\2</column>
<column name="\1">\2</column>

Ou faire de même de l'intérieur vi, il génère:

<column name=""></column>
<column name=""></column>

Comment puis-je faire en sorte que \1et \2sont substitués à leurs valeurs d'origine?

Mike
la source

Réponses:

21

Vous pouvez utiliser des groupes, par exemple:

$ sed -i 's/<\(.*\)>\(.*\)<.*>/<column name="\1">\2<\/column>/g' filename.xml

La partie la plus déroutante des ER est probablement qu'il existe différentes saveurs syntaxiques.

Par exemple, sed et vim utilisent des expressions régulières de base où vous devez citer ()pour obtenir leur méta-signification.

Avec les expressions régulières étendues (par exemple awk, egrep et moins), vous devez citer ()pour obtenir le sens littéral. Il existe des différences similaires pour les autres méta-caractères.

La logique de la ()sémantique BRE est que lorsque la plupart de vos entrées sont du code C, il est plus pratique de devoir citer des parenthèses pour une méta-utilisation.

maxschlepzig
la source
C'était en fait la première chose que j'essayais, mais je n'ai pas échappé aux caractères (et ). Question stupide, mais pourquoi est-ce nécessaire?
Mike
1
@Mike, bonne question - a mis à jour la réponse.
maxschlepzig le