2010-07-21 21 views
22

que tienen muchas líneas de la formagrupos de captura de sed

ko04062 ko:CXCR3 
ko04062 ko:CX3CR1 
ko04062 ko:CCL3 
ko04062 ko:CCL5 
ko04080 ko:GZMA 

y sería muy caro gustaría deshacerse del ko: poco de la columna de la derecha. Estoy tratando de usar sed, de la siguiente manera:

echo "ko05414 ko:ITGA4" | sed 's/\(^ko\d{5}\)\tko:\(.*$\)/\1\2/' 

que simplemente genera la cadena original que hice eco. Soy muy nuevo en el scripting de líneas de comando, sed, pipes, etc., así que no te enojes si/cuando estoy haciendo algo extremadamente tonto.

Lo principal que me confunde es que ocurre lo mismo si invierto el bit \1\2 para leer \2\1 o simplemente uso un grupo. Supongo que esto implica que me falta algo sobre la mecánica de conectar la salida del eco en sed, o que mi expresión regular es incorrecta o que estoy usando sed o que Sed no está imprimiendo los resultados de la sustitución. .

¡Cualquier ayuda sería muy apreciada!

+4

¿Por qué no puedes usar sed 's/ko \: // g'? – Anders

+0

¿por qué no estás usando Perl? :-P – eruciform

+4

no sé Perl! aprendiendo sed ahora. Aprenderá perl, y cualquier otra cosa, cuando sea necesario ... –

Respuesta

21

sed está enviando su entrada porque la sustitución no coincide. Dado que es probable que el uso de GNU sed, intente esto:

echo "ko05414  ko:ITGA4" | sed 's/\(^ko[0-9]\{5\}\)\tko:\(.*$\)/\1\2/' 
  • \ d -> [0-9], ya sed de GNU no reconoce \ d
  • {} -> \ {\} ya que GNU sed usa de manera predeterminada expresiones regulares básicas.
+2

esto todavía me da el mismo error. Estoy en OSX - no estoy seguro de cómo averiguar si estoy usando GNU sed ... –

+7

@Mike Dewar - ooh, esa es información importante ... creo que OS X usa un sed de tipo BSD, mientras que es un la suposición común aquí es que la gente usa GNU sed –

+0

¡eso es importante saber! ¡Muchas gracias! –

9

Esto debería hacerlo. También puede omitir el último grupo y simplemente usar, \1, pero como está aprendiendo sed y expresiones regulares, esto es bueno. Quería usar un grupo que no captura en el medio (:?) pero no pude conseguir eso para jugar con sed por cualquier razón, quizás no sea compatible.

sed --posix 's/\(^ko[0-9]\{5\}\)\(ko:\)\(.*$\)/\1 \3/g' file > result 

Y por supuesto puede utilizar

sed --posix 's/ko://' 
+0

¡Muchas gracias por esto! He votado a favor de tu respuesta porque has acertado con esto, y el 's/ko: //' es genial (aunque, ¿qué está haciendo ese revés?). Le doy la señal a ninjalj porque su respuesta + comentarios me ha explicado lo que estaba haciendo mal. ¡Pero definitivamente me quedo con 's/ko: //' o incluso con la cadena reemplazada por getekha! Veré cuál es más rápido ... –

+0

Mi mal, restos de una variable. Sí, yo también se lo daría, se molestó en explicarlo. – Anders

5

Usted no necesita sed para este

Aquí es cómo usted puede hacerlo con bash:

var="ko05414 ko:ITGA4" 
echo ${var//"ko:"} 

$ {var // "ko:"} reemplaza todo "ko:" con ""

Ver Manipulating Strings para obtener más información

+0

Lea los comentarios, dijo que está aprendiendo sed. – Anders

+3

mientras estoy aprendiendo, este enfoque me parece genial y simple. No tenía idea sobre esta sintaxis. Toda esta línea de comando fu es impresionante. –

+1

Mi error, le pido disculpas a getekha. – Anders

0

@OP, si sólo quiere deshacerse de "ko", entonces

$ cat file 
ko04062 ko:CXCR3 
ko04062 ko:CX3CR1 
ko04062 ko:CCL3 
ko04062 ko:CCL5 
some text with a legit ko: this ko: will be deleted if you use gsub. 
ko04080 ko:GZMA 

$ awk '{sub("ko:","",$2)}1' file 
ko04062 CXCR3 
ko04062 CX3CR1 
ko04062 CCL3 
ko04062 CCL5 
some text with a legit ko: this ko: will be deleted if you use gsub. 
ko04080 GZMA 

jsut una nota. Si bien puedes usar la sustitución pura de cadenas bash, solo es más eficiente cuando estás cambiando una sola cadena. Si tiene un archivo, especialmente un archivo grande, usar bash's mientras el ciclo de lectura es aún más lento que usar sed o awk.

Cuestiones relacionadas