2010-01-16 18 views
10

Tengo un patrón regex y de reemplazo que se han probado en Notepad ++ en mis datos de entrada y funcionan correctamente. Cuando los pongo en una expresión sed, sin embargo, nada se empareja.Escapar secuencias de sed correctamente

Aquí es el comando sed:

# SEARCH = ([a-zA-Z0-9.]+) [0-9] (.*) 
# REPLACE = \2 (\1) 

sed -e 's/\([a-zA-Z0-9.]+\) [0-9] \(.*\)/\2 \(\1\)/g' 

Aquí es una muestra de los datos:

jdoe 1 Doe, John 
jad 1 Doe, Jane 
smith 2 Smith, Jon 

y la salida deseada:

Doe, John (jdoe) 
Doe, Jane (jad) 
Smith, Jon (smith) 

He intentado eliminar y añadir escapa a diferentes caracteres en la expresión sed, pero o bien no obtiene nada igual o algo así como:

sed: -e expression #1, char 42: invalid reference \2 on `s' command's RHS 

¿Cómo puedo obtener esto escapado correctamente?

Respuesta

17

por lo general me resulta más fácil utilizar el modificador -r ya que esto significa que se escape es similar a la de la mayoría de los otros idiomas:

signo
sed -r 's/([a-zA-Z0-9.]+) [0-9] (.*)/\2 (\1)/g' file1.txt 
+0

que funcionó muy bien. Gracias. –

4

El plus que necesitamos indicar cuando no utilice el interruptor de -r.

9

algunas advertencias y adiciones a lo que todo el mundo ha dicho:

  1. La opción -r es una extensión de GNU para permitir expresiones regulares extendidas. BSD deriva el uso de sed -E en su lugar.
  2. Sed y Grep uso Basic Regular Expressions
  3. Awk utiliza Extended Regular Expressions
  4. Usted debe sentirse cómodo con el POSIX specifications como IEEE Std 1003.1 si desea escribir scripts portátiles, archivos make, etc.

recomendaría volver a escribir el expresión como

's/\([a-zA-Z0-9.]\{1,\}\) [0-9] \(.*\)/\2 (\1)/g' 

, que debería hacer exactamente lo que usted desea en cualquier POSIX que cumpla con sed. Si realmente te importan esas cosas, considera definir la variable de entorno POSIXLY_CORRECT.

1
$ sed -e 's/\([a-zA-Z0-9.].*\) [0-9] \(.*\)/\2 \(\1\)/g' file 
Doe, John (jdoe) 
Doe, Jane (jad) 
Smith, Jon (smith) 
2

Utilizando awk es mucho más simple ...:

cat test.txt | awk '{ print $3 " " $4 " " "("$1")" }' 

Salida:

Doe, John (jdoe) 
Doe, Jane (jad) 
Smith, Jon (smith) 

Ver hombre awk 1

Cuestiones relacionadas