2010-11-12 10 views
6

Je crée une table en emacs org-mode des commandes sunrise-commander à partir du fichier .el (je veux faire une feuille de triche). La liste ressemble à ceci:sed: remplacer plusieurs périodes par un autre caractère

/, j .......... go to directory 
p, n .......... move cursor up/down 
M-p, M-n ...... move cursor up/down in passive pane 
^, J .......... go to parent directory 
... 

Je veux que cela soit dans une table en mode org avec ce format:

| /, j  | go to directory      | 
| p, n  | move cursor up/down     | 
| M-p, M-n | move cursor up/down in passive pane | 
| ^, J  | go to parent directory    | 
... 

Org prendra soin de l'espacement; J'ai juste besoin de "| commande | explication |"

Je ne peux pas obtenir sed pour remplacer plusieurs périodes avec un slash vertical. Mes tentatives actuelles ont été comme ceci:

cat in.org | sed -e 's/[.]*/|/g' > out.org 
cat in.org | sed -e 's/[.]/|/g' > out.org 
cat in.org | sed -e 's/[.*]/|/g' > out.org 

Je l'ai déjà utilisé cette option pour remplacer les espaces avant et des barres obliques verticales:

sed -e 's/^[ \t]*/|/g;s/[ \t]*$/|/g'| 

Maintenant, je dois juste faire la même chose pour une chaîne de périodes. Je crains de ne pas comprendre assez bien le sed pour qu'il traite des périodes comme une période (et cible une goutte d'entre elles) plutôt que de les traiter comme des wildcards. Le deuxième et le troisième traitent chaque période comme une période, car je finis avec un tas de barres verticales.

Mais le premier semble juste mettre une barre oblique entre chaque caractère, donc je ne sais pas pourquoi il le fait. On dirait que ça revient à agir comme le caractère générique.

Merci pour toute aide.

Répondre

4

Vous devez échapper à la période; La période correspond à "n'importe quel caractère". Et, étant donné que sed n'a pas toujours + (1 ou plus) opérateur, vous souhaitez utiliser un suivi de 0 ou plus, comme dans

[email protected]:~$ echo 'h...ello world' | sed 's/^/|/;s/\.\.*/|/;s/$/|/' 
|h|ello world| 

Et, après avoir relu votre question, vous voulez un tuyau à le début et la fin. Donc, remplacez^et $ par un tuyau. Vous pouvez faire cela avec trois expressions -e, mais j'aime juste mettre tous les trois dans la ligne de commande séparés par des points-virgules. Cela aide à faire ressembler le motif au bruit de ligne. :)

Si vous voulez faire correspondre, par exemple, 2 périodes ou plus, utilisez \.\.\.*. Etc. Il est dommage que sed ne supporte pas de manière cohérente les expressions de plage.

+0

Merveilleux. C'était en premier et fonctionnait très bien. Maintenant que j'y pense, la syntaxe est logique, même si mon problème était que * correspondait à "1 ou plus", pas 0 ou plus, auquel cas vous aviez raison: j'avais besoin d'une période suivie de 0 ou plusieurs périodes. – Hendy

4

Cela devrait le faire pour vous:

sed -r -e 's/\.{2,}/|/' -e 's/(.*)/|\1|/' 

Le {2,} dit juste pour correspondre 2 ou plus, de sorte que si vous avez des périodes dans d'autres endroits, vous avez l'habitude d'un problème. Le '-e' produit plusieurs expressions régulières, et le '-r' signifie utiliser des regexes étendues.

Espérons que cela fonctionne, il le fait sur gnu sed 4.1.2.

+0

Comme pour la solution {2,}. C'est génial. Il n'y a pas eu plus de périodes mais de grandes idées - codage prudent! Je ne suis pas la deuxième partie, cependant. Pour moi, cela a surtout fonctionné mais j'ai inséré beaucoup d'onglets dans la première colonne donc mon résultat était comme "| commande \ t \ t \ t | explication |". Difficile de taper dans la boîte de commentaire! – Hendy

Questions connexes