2010-11-12 18 views
6

Ich mache eine Tabelle in Emacs Org-Modus von Sonnenaufgang-Commander-Befehle aus der .el-Datei (wollen einen Spickzettel machen). Die Liste sieht wie folgt aus:sed: Ersetze mehrere Punkte durch ein anderes Zeichen

/, 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 
... 

ich, dass in ein org-Modus Tabelle mit diesem Format machen wollen:

| /, 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 wird der Abstand kümmern; Ich brauche nur "| Befehl | Erklärung |"

Ich kann sed nicht erhalten, um mehrere Perioden durch einen vertikalen Schrägstrich zu ersetzen. Mein aktueller Versuche so gewesen:

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 

Ich habe dies bereits ersetzen führende und nachfolgende Leerzeichen mit vertikalen Schrägstriche:

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

Jetzt gerade muss ich das gleiche für eine Reihe von Perioden. Ich fürchte, ich verstehe sed nicht gut genug, um Perioden wie eine Periode zu behandeln (und auf einen Haufen davon zu zielen), anstatt sie als Wildcards zu behandeln. Die zweite und dritte behandeln jede Periode wie eine Periode, als ich mit einer Reihe von vertikalen Schrägstrichen enden.

Aber die ersten scheinen nur einen vert Schrägstrich zwischen jedem einzelnen Zeichen zu setzen, also bin ich nicht sicher, warum es das tut. Es scheint, als würde es sich wieder wie ein Wildcard-Charakter verhalten.

Danke für jede Hilfe.

Antwort

4

Sie müssen den Zeitraum zu entkommen; Die Periode entspricht "einem beliebigen Zeichen". Und da sed nicht immer ein + (1 oder mehr) Operator hat, möchten Sie einen von 0 oder mehr gefolgt verwenden, wie in

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

Und nach Ihrer Frage rereading, Sie wollen ein Rohr an der Anfang und das Ende. Ersetzen Sie also auch^und $ durch eine Pipe. Sie können das mit drei-e-Ausdrücken tun, aber ich mag es, alle drei in die Befehlszeile zu setzen, getrennt durch Semikolons. Es hilft, das Muster eher wie Linienrauschen aussehen zu lassen. :)

Wenn Sie zwei oder mehr Perioden abgleichen möchten, verwenden Sie \.\.\.*. Es ist eine Schande, dass sed nicht konsequent Bereichsausdrücke unterstützt.

+0

Wunderbar. Das war zuerst und hat super funktioniert. Nun, da ich darüber nachdenke, macht die Syntax Sinn, obwohl mein Problem war, dass * "Übereinstimmung 1 oder mehr" war, nicht 0 oder mehr. In diesem Fall hatten Sie Recht: Ich brauchte einen Punkt gefolgt von 0 oder mehr Punkten. – Hendy

4

Dies sollte es für Sie tun:

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

Die {2,} sagt nur 2 oder mehr passen, so dass, wenn Sie in Zeiten, in anderen Orten laufen, man wird nicht ein Problem haben. Das '-e' geht mehrere Regexes, und das '-r' bedeutet erweiterte Regexes.

Hoffe es funktioniert, es tut auf gnu sed 4.1.2.

+0

Wie für die {2,} Lösung. Das ist großartig. Es gab nicht mehr Perioden, sondern großes Denken - sorgfältige Codierung! Ich folge jedoch nicht dem zweiten Teil. Für mich funktionierte das meistens, aber es wurden viele Tabs in die erste Spalte eingefügt, so dass mein Ergebnis wie "| command \ t \ t \ t \ t | explication |" war. Schwer im Kommentarfeld zu tippen! – Hendy

Verwandte Themen