2012-08-15 6 views
1

J'essaie de remplacer;sed: changer l'ordre des mots et remplacer

randomtext{{XX icon}} 

par

randomtext{{ref-XX}} 

..dans un fichier, où XX peut être toute séquence de 2 ou 3 lettres minuscules. J'ai tenté de réarranger l'ordre des mots avec awk avant de remplacer «icon» par «ref-» avec sed; Mais comme il n'y a pas d'espace avant le premier mot, ni après le second, il a gâché les accolades;

icon}} {{XX 

Quelle est la façon la plus simple d'y parvenir en utilisant sed?

Répondre

2
sed 's/{{\([a-z]\{2,3\}\)\sicon/{{ref-\1/' 

Celui-liner utilise la commande de substitution s/PATTERN/REPLACE/. {{ correspond à deux crochets. \([a-z]\{2,3\}\) capture le motif correspondant à 2 ou 3 lettres minuscules. \s correspond à un espace blanc. icon correspond à la chaîne littérale "icône". Ensuite, nous remplaçons le match, c'est {{....icon avec la chaîne littérale {{ref- et le mot de 2 ou 3 lettres capturé.

+0

Cela fonctionne, mais pourriez-vous expliquer rapidement ce qui se passe? – octosquidopus

1

est ici une version plus générique en utilisant les balises de hachage (#) comme séparateur regex:

sed 's#{{\([^ ]*\) [^}]*#{{ref-\1#' 
  • {{ ancres regex aux accolades doubles ouvertes.
  • \([^ ]*\) capture tout jusqu'à un espace.
  • [^}]* mange tout jusqu'à une accolade de fermeture.