2009-06-24 17 views
2

Je me demandais si quelqu'un pouvait vous aider à faire ce qui suit en utilisant vi.vi recherche copier coller rechercher copier

Je dispose d'un fichier texte et il peut contenir quelque chose comme

start of text file: 
--something1.something2-- 
--anotherThing1.something2-- 
end of text file: 

Si je veux profiter de cette ligne et de le convertir au moyen de la recherche de quoi que ce soit correspondant à la première occurrence de [A-Za-z0-9] copier ce fichier dans la mémoire tampon puis l'ajouter sur la même ligne avant le premier événement de -

start of text file: 
--something1.something2.something1-- 
--anotherThing1.something2.anotherThing1-- 
end of text file: 

Y a-t-il une seule commande VI pour faire cela?

Vive Ben

+0

Vous voulez donc copier le premier mot après '-' jusqu'au premier '.' et ajoutez '.' et mot trouvé avant le dernier '-'? – stefanB

Répondre

5
:%s/--\([a-zA-Z0-9]*\).\(.*\)--/--\1.\2.\1--/gc 

ou sans demander confirmation pour chaque remplacerons:

:%s/--\([a-zA-Z0-9]*\).\(.*\)--/--\1.\2.\1--/g 

produira:

--something1.something2.something1-- 
--anotherThing1.something2.anotherThing1-- 

de:

--something1.something2-- 
--anotherThing1.something2-- 

Ceci est si vous voulez copier le premier mot après '-' jusqu'au premier '.' et ajoutez '.' et mot trouvé avant le dernier '-'.

Utilisation de vim.

RE COMMENTAIRES:

Quelqu'un a mentionné qu'il ne fonctionne pas quand il y a plusieurs mots et ainsi de suite. Je l'ai testé sur les points suivants:

start of text file: 
--something1.something2.something3.something4.something5.something6-- 
--anotherThing1.something2.anotherThing3.anotherThing4.anotherThing5-- 
end of text file: 

après remplacer par l'expression ci-dessus:

start of text file: 
--something1.something2.something3.something4.something5.something6.something1-- 
--anotherThing1.something2.anotherThing3.anotherThing4.anotherThing5.anotherThing1-- 
end of text file: 
+1

Retirez le "c" de la fin si vous ne voulez pas être invité à confirmer chaque remplacement. –

+0

Le modificateur/g de la regex n'est pas nécessaire. Votre expression régulière ne fonctionne pas s'il existe plusieurs occurrences de --text.text-- sur une ligne. – user55400

+0

que voulez-vous dire par --text.text-- ... avez-vous un exemple qui échoue? – stefanB

1

Bordel, dans le temps qu'il m'a fallu pour se connecter pour poster cette réponse, vous avez publié et déjà J'ai eu un commentaire!

%s/--\(\w*\)\.\(.*\)--/--\1.\2.\1--/g 

--ab1.cd2..yz99-- -> --ab1.cd2..yz99.ab1--

+0

Je l'ai d'abord testé avant de poster ... – stefanB

1

Essayez ceci:

%s:\([A-Za-z0-9]\+\)\(\..\+\)--:\1\2.\1--:g 
0

Miser sur la solution de stefanB mais en utilisant des classes de caractère niées et la « très magique » cadre, je suis arrivé à la commande de substitution suivante:

:%s/\v--([^.]+)\.(.*)--/--\1.\2.\1--/ 

en fonction des besoins précis (ce sont permis chara cters pour "something1" et "anotherThing1") cela pourrait être ou ne pas être plus correct.

Encore une chose à considérer: toutes les solutions postées supposent que le motif "--text.someOtherText-- ne comporte qu'une seule occurence." Si ce n'est pas le cas, la partie (. *) De le motif devrait être ajusté et le modificateur/g est requis.

+0

J'ai effectivement testé avec plusieurs segments comme "--anotherThing1.something2.anotherThing1.anotherThing1.anotherThing1--" il sera toujours ajouter le premier mot avant le dernier - – stefanB

Questions connexes