2010-11-12 13 views
6

Sto creando una tabella in emacs org-mode dei comandi sunrise-commander dal file .el (voglio fare un cheat sheet). La lista si presenta così:sed: sostituire più periodi con un altro carattere

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

Voglio fare che in una tabella org-mode con questo formato:

| /, 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 si prenderà cura di spaziatura; Ho solo bisogno di "| comando | spiegazione |"

Non riesco a sedermi per sostituire più periodi con una barra verticale. I miei attuali tentativi sono stati in questo modo:

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 

ho già usato questo per sostituire spazi iniziali e finali con barre verticali:

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

Ora ho solo bisogno di fare lo stesso per una serie di periodi. Temo di non capire abbastanza bene da farlo trattenere periodi come un periodo (e bersagliare un blob di essi) piuttosto che trattarli come wildcard. Il secondo e il terzo trattano ogni periodo come un periodo, mentre finisco con un gruppo di barre verticali.

Ma il primo sembra solo mettere una barra vertiginosa tra ogni singolo personaggio, quindi non sono sicuro del perché lo stia facendo. Sembra che stia tornando a comportarsi come un personaggio jolly.

Grazie per qualsiasi aiuto.

risposta

4

Hai bisogno di scappare dal periodo; Il periodo corrisponde a "qualsiasi carattere". E, dal momento che sed non ha sempre a + (1 o più) operatore, è preferibile utilizzare uno seguito da 0 o più, come in

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

E, dopo aver riletto la tua domanda, si vuole un tubo alla l'inizio e la fine Quindi, sostituisci^e $ con una pipe. Puoi farlo con tre -e espressioni, ma mi piace mettere tutti e tre nella riga di comando separati da punto e virgola. Aiuta a rendere il modello più simile al rumore della linea. :)

Se si desidera abbinare, per esempio, 2 o più periodi, utilizzare \.\.\.*. Ecc. È un peccato che sed non supporta coerentemente le espressioni di gamma.

+0

Meraviglioso. Questo è stato il primo e ha funzionato alla grande. Ora che ci penso, la sintassi ha senso, anche se il mio problema era pensare che * fosse "match 1 o più", non 0 o più, nel qual caso avevi ragione: avevo bisogno di un periodo seguito da 0 o più periodi. – Hendy

4

Questo dovrebbe farlo per voi:

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

Il {2,} dice solo per abbinare 2 o più, in modo che se si esegue in periodi in altri luoghi, non avrete un problema. Il "-e" procede alle regex multiple e "-r" significa usare espressioni regolari estese.

Spero che funzioni, lo fa su gnu sed 4.1.2.

+0

Mi piace per la soluzione {2,}. È fantastico. Non ci sono stati più periodi ma grandi riflessioni - un'accurata codifica! Non seguo la seconda parte, però. Per me, ha funzionato principalmente, ma ha inserito molte schede nella prima colonna, quindi il mio risultato era come "| comando \ t \ t \ t \ t | spiegazione |". Difficile digitare nella casella dei commenti! – Hendy

Problemi correlati