2 votes

vi recherche copier coller recherche copier

Je me demandais juste si quelqu'un pouvait m'aider à faire ce qui suit en utilisant vi.

J'ai un fichier texte et il pourrait contenir quelque chose comme

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

Si je veux prendre cette ligne et la convertir en recherchant tout ce qui correspond à la première occurrence de [A-Za-z0-9] copier cela dans le tampon puis l'ajouter sur la même ligne avant la première occurence de --

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

Existe-t-il une seule commande VI pour faire cela ?

Salutations Ben

5voto

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

ou sans demander confirmation pour chaque remplacement :

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

produira :

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

de :

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

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

Utilisation de vim.

RE COMMENTAIRES :

Quelqu'un a mentionné que cela ne fonctionne pas lorsqu'il y a plusieurs mots, etc. Je l'ai testé sur les éléments suivants :

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

après avoir remplacé 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:

1voto

Bashwork Points 1258

Bon sang, le temps que je me connecte pour poster cette réponse, tu l'as postée et tu as déjà un commentaire !

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

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

1voto

Alan Haggai Alavi Points 34260

Essayez ça :

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

0voto

user55400 Points 1969

En m'appuyant sur la solution de stefanB mais en utilisant des classes de caractères négatives et le paramètre "très magique", j'arrive à la commande de substitution suivante :

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

En fonction des exigences exactes (quels sont les caractères autorisés pour "something1" et "anotherThing1"), cela peut être plus ou moins correct.

Une dernière chose à prendre en compte : toutes les solutions proposées jusqu'à présent supposent qu'il n'y a qu'une seule occurrence du motif "--text.someOtherText-- par ligne. Si ce n'est pas le cas, la partie (.*) du motif doit être ajustée et le modificateur /g est nécessaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X