Ce que j'essaie de faire est de prendre une liste qui est formatée de la même manière qu'une table des matières et remplace les espaces (caractères d'espacement simples, et non de tabulations) entre les textes de gauche et de droite par des points, en ne conservant que les deux espaces les plus externes.
Donc précisément, je veux prendre une liste comme celle-ci:
foo url1
foobar url2
foo bar url3
Et convertissez-le en ceci:
foo ...... url1
foobar ... url2
foo bar .. url3
J'utilise l' IDE Eclipse pour éditer mon texte. Je ne connais pas bien les différents moteurs de regex, mais je suppose qu’il utilise soit Jakarta Regexp, soit java.util.regex (que j’ai consulté sur Wikipedia).
Je peux capturer les caractères d'espacement dans le champ Rechercher à l' aide de " ( +)
", mais je ne sais pas comment les convertir en autant de points dans le champ Remplacer par .
J'ai fait des recherches sur Google et je suis tombé sur cette question (c'est là que j'ai appris la " ( +)
" syntaxe). Il semble que ce soit la même chose, ou une question similaire à la mienne. Mais soit je n’ai pas trouvé ma réponse, soit je n’ai tout simplement pas compris les réponses données.
la source
site:superuser.com
ousite:unix.stackexchange.com
.sed
.Réponses:
Vous pouvez le faire avec Notepad ++
(?<!\S) (?= )
.
Explication:
Remplacement:
Résultat pour l'exemple donné:
la source
foo.......␣url1
?(?<=\s)
), l'espace avant est obligatoire, a contrario(?<!\S)
rend l'espace optionnel et c'est le cas après que le premier espace a été remplacé par un point.La question indique explicitement que les titres contiendront des espaces. Pour des raisons de sécurité, je suppose que les titres peuvent contenir des points (points); par exemple, “L’histoire de 3.14159” ou “Dr. Doolittle's Discovery ». Mes réponses supposent qu'il y a un caractère qui n'apparaîtra jamais dans la table des matières; en particulier, ils supposent que c'est
@
. Si vous avez@
dans votre table, le remplacer par un caractère qui n'apparaît (par exemple,#
,^
,_
,|
, etc.). Si vous utilisez réellement tous les caractères ASCII, vous devrez peut-être utiliser une séquence de caractères, comme<@>
.Trois façons de le faire avec
sed
:Boucle:
s/\(.*\)\( \)/\1@\2/
trouve le dernier espace sur la ligne et insère un@
avant.:loop
est une étiquette, comme un marqueur de mile.s/ @/ @./
(c'est-à-dires/␣␣@/␣@./
, pour la non-ambiguïté) dit, s'il y a deux espaces avant le@
, les remplace par␣.
(espace et point) et déplacez-les@
entre eux.t loop
si la substitution ci-dessus a réussi, dit de revenir au:loop
marqueur et de répéter. Sinon, continuez às/@//
, qui supprime le@
.Donc, la
foo bar
ligne dans votre table sera traitée comme suit:Chiffres écrasants:
s/\(.*\)\( \)/\1@@@@@@@@@@@@@@@@@@@@\2/
est très similaire à la premières
sous-commande de la première solution; il trouve le dernier espace sur la ligne et insère une chaîne de 20@
caractères devant elle. Cela devrait en fait être un nombre au moins aussi grand que le nombre maximum de points que vous devrez jamais insérer sur une seule ligne; par exemple, 80. La gestion d'une chaîne de 80@
caractères serait délicate; vous voudrez peut-être remplacer ceci pars/\(.*\)\( \)/\1<@><@><@><@><@>\2/; s/<@>/@@@@@@@@/g
qui insère une chaîne de cinq<@>
séquences, puis remplace chacune d’elles par une chaîne de 16@
caractères, ce qui donne 5 × 16 = 80@
caractères.s/ [ @]\{20\}/ /
trouve une chaîne de 20 caractères consécutifs qui sont soit un espace, soit un@
précédé d'un espace et le remplace par le seul espace précédent. Remplacez-le20
par le numéro de l'étape précédente.s/@/./g
remplace chaque reste@
par un point.Donc, la
foo
ligne dans votre table sera traitée comme suit:Utilisez la "cale":
s/.*[^ ] /&@/
est similaire aux commandes précédentes; il trouve la fin du titre - pour être précis, le dernier endroit où un caractère non vide est suivi d'un espace - et insère un@
après celui-ci.h
copie la ligne dans l'espace réservé.s/ /./g
remplace tous les espaces de la ligne par des points.s/\(\.*\)\./\1 /
remplace le dernier point par un espace. (Cela devra changer si l'URL peut contenir des points, ce qui est probable, je suppose.)x
échange l'espace motif et l'espace d'attente.G
ajoute l'espace de maintien à l'espace du motif. Nous avons maintenant essentiellement deux copies de la ligne.s/@.*@//
conserve la première partie de la première copie et la seconde partie de la deuxième copie, en éliminant le contenu au milieu.la source