2012-08-30 37 views
14

Tengo una cadena de la que quiero eliminar la puntuación?¿Cómo reemplazo los corchetes [] con SED

Comencé con

sed 's/[[:punct:]]/ /g' 

pero tuve problemas en HP-UX no le gustaba que todo el tiempo, y algunas veces me gustaría tener un 0 nada y después de un $ en mi cadena que desaparecerá. Así que decidí intentar hacerlo manualmente.

Tengo el siguiente código que funciona con todos mis signos de puntuación que me interesan, excepto que parece que no puedo agregar corchetes "[]" a mi sed con cualquier otra cosa, de lo contrario no reemplaza nada, y no lo hago obtener un error, por lo que no estoy seguro de qué arreglar.

De todos modos, esto es lo que tengo actualmente y me gustaría agregar [] a.

sed 's/[-=+|[email protected]#\$%^&*(){}:;'\'''\"''\`''\.''\/''\\']/ /g' 

Por cierto estoy usando KSH en Solaris, RedHat & HP

+0

¿El punto y coma en su ': punct;' es un error tipográfico? –

+1

¿Por qué estás usando sed para esto? Para reemplazar un gran grupo de caracteres con un espacio, es mejor usar 'tr'. –

+0

@Will - sí, eso es un error tipográfico ... no puedo editar mi OP. ¿Cómo usaría tr para reemplazar mi puntuación por espacios? Intenté usar el [: punct:] con TR y SED inútilmente. – nitrobass24

Respuesta

1

Aquí es el código final terminé con

`echo "$string" | sed 's/[^a-zA-Z0-9]/ /g'` 

que tenía que poner = y - en el final

19

Es necesario colocar los soportes temprano por la expresión:

sed 's/[][=+...-]/ /g' 

Al colocar la ']' como primer carácter inmediatamente después del corchete de apertura, se interpreta como un miembro del conjunto de caracteres en lugar de un corchete de cierre. Colocar un '[' en cualquier lugar dentro de los corchetes lo convierte en un miembro del conjunto.

Para este juego de caracteres en particular, también debe tratar con - especialmente, ya que no está tratando de crear un rango de caracteres entre [ y =. Así que ponga el - al final de la clase.

+0

Sí ... eso es lo que estaba pensando originalmente, pero cuando lo hice siempre recibí un error de fin de rango no válido echo word1 $ word2 | sed 's/[] - = + | ~! @ # \ $%^& *() {}:;' \ '' '\ "' '\'' '\.' '\ /' '\\' []// g ' sed: -e expresión # 1, char 36: final de rango inválido – nitrobass24

+0

El' rango no válido 'se debe a '-'. Cuando' -' aparece en el medio, sed intenta crear un rango de caracteres. Use '\ -' en su lugar. –

+0

El' -' debe estar en la posición del primer carácter de la clase de caracteres para representar un guión, de lo contrario se puede interpretar como un metacaracter de clase de caracteres que indica un rango de caracteres – potong

3

También puede especificar los caracteres que desea mantener [con inversión]:

sed 's/[^a-zA-Z0-9]/ /g' 
+0

Eso es algo que ni siquiera me di cuenta era posible. Parece que funciona bastante bien, excepto cuando hay un "$" en mi cadena ... cualquier cosa después de que se elimine el "$". Intenté ' palabra de eco 1 $ palabra2 | sed 's/[^ a-zA-Z0-9]// g'' y mi salida fue 'word1' – nitrobass24

+2

es la shell interpretando' $ word2' como una variable, intente 'echo' word1 $ word2'' o 'echo word1 \ $ word2' – perreal

+0

Lo que terminé haciendo finalmente fue guardar mi cadena como una variable ... y luego pasar la variable entre comillas dobles. 'echo" $ string "| sed 's/[^ a-zA-Z0-9]// g'' – nitrobass24

2

Puede hacerlo de forma manual:

sed 's/[][\/$*.^|@#{}~&()_:;%+"='\'',`><?!-]/ /g' 

Esta eliminar el carácter 32 puntuacion, del orden de algunos personajes es importante:

  • - debe estar en el extremo como éste -]
  • [] debe ser así [][other characters]
  • ' debe ser escapado de esa manera '\''
  • no comienza con ^ como en [^
  • no comienza con [.[=[: y terminan con .]=]:]
  • no termina con $]

aquí se puede tener explicación de por qué todo que http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_03

0

Puede ser mano led utilizando la técnica de captura de expresiones regulares también (por ejemplo: aquí abajo):

echo "narrowPeak_SP1[FLAG]" | sed -e 's/\[\([a-zA-Z0-9]*\)\]/_\1/g' 
> narrowPeak_SP1_FLAG 

\[ : literal match to open square bracket, since [] is a valid regex 
\] : literal match to square close bracket 
\(...\) : capture group 
\1 : represents the capture group within the square brackets 
Cuestiones relacionadas