2010-11-12 15 views
6

Estoy haciendo una tabla en emacs org-mode de los comandos de sunrise-commander del archivo .el (quiero hacer una hoja de trucos). La lista se parece a esto:sed: reemplaza varios períodos con otro carácter

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

quiero hacer eso en una mesa de modo org con este 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 se hará cargo de separación; Solo necesito "| comando | explicación |"

No puedo obtener sed para reemplazar períodos múltiples con una barra vertical. Mis intentos actuales han sido así:

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 

que ya ha utilizado esta opción para sustituir espacio inicial y final con barras verticales:

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

Ahora sólo hay que hacer lo mismo con una serie de períodos. Me temo que no entiendo sed lo suficientemente bien como para hacer que trate períodos como un punto (y apuntar a una burbuja de ellos) en lugar de tratarlos como comodines. El segundo y el tercero tratan cada período como un período, ya que termino con un montón de barras verticales.

Pero el primero simplemente parece poner una barra vertical entre cada carácter, así que no estoy seguro de por qué lo está haciendo. Parece que va a volver a actuar como el personaje comodín.

Gracias por cualquier ayuda.

Respuesta

4

Necesita escapar del período; El período coincide con "cualquier personaje". Y, puesto que sed no siempre tiene un operador + (1 o más), que desea utilizar uno seguido de 0 o más, como en

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

y, después de releer su pregunta, usted quiere un tubo en el comienzo y el final Entonces, reemplace^y $ con una tubería también. Puedes hacer eso con tres expresiones, pero me gusta simplemente poner las tres en la línea de comando separadas por punto y coma. Ayuda a que el patrón se parezca más al ruido de línea. :)

Si quiere hacer coincidir, digamos, 2 o más puntos, use \.\.\.*. Etc. Es una lástima que sed no soporte consistentemente expresiones de rango.

+0

Maravilloso. Esto fue primero y funcionó muy bien. Ahora que lo pienso, la sintaxis tiene sentido, aunque mi problema fue pensar que * era "coincidencia 1 o más", no 0 o más, en cuyo caso usted tenía razón: necesitaba un período seguido de 0 o más períodos. – Hendy

4

Esto debe hacerlo por usted:

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

El {2,} se limita a decir para que coincida con 2 o más, de manera que si llegas a tener períodos en otros lugares, usted no tendrá un problema. El '-e' procede de múltiples expresiones regulares, y el '-r' significa el uso de expresiones regulares extendidas.

Espero que funcione, lo hace en gnu sed 4.1.2.

+0

Dale me gusta para la solución {2,}. Eso es genial. No hubo más períodos sino una gran reflexión: ¡codificación cuidadosa! No sigo la segunda parte, sin embargo. Para mí, funcionó en su mayoría, pero insertó muchas pestañas en la primera columna, por lo que mi resultado fue como "| comando \ t \ t \ t \ t | explicación |". Es difícil escribir en el cuadro de comentarios! – Hendy

Cuestiones relacionadas