2010-07-21 16 views
22

Ho molte linee di formagruppi di cattura in sed

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

e sarebbe caro vuole sbarazzarsi del ko: bit della colonna di destra. Sto cercando di usare sed, come segue:

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

che emette semplicemente la stringa originale che echo'd. Sono molto nuovo nello scripting da riga di comando, sed, pipe ecc. Quindi per favore non essere troppo arrabbiato se/quando sto facendo qualcosa di estremamente stupido.

La cosa principale che mi confonde è che la stessa cosa accade se inverto il bit \1\2 per leggere \2\1 o semplicemente utilizzare un gruppo. Questo, immagino, implica che mi manchi qualcosa sui meccanismi di convogliare l'output di eco in sed, o che il mio regexp è sbagliato o che sto usando sed torto o che sed non sta stampando i risultati della sostituzione .

Qualsiasi aiuto sarebbe molto apprezzato!

+4

Qualsiasi motivo per cui non è possibile utilizzare sed 's/ko \: // g'? – Anders

+0

nessun motivo per cui non stai usando perl? :-P – eruciform

+4

non conosco Perl! apprendimento sed ora. Impareremo perl e qualsiasi altra cosa, come e quando necessario ... –

risposta

21

sed sta emettendo il proprio input perché la sostituzione non corrisponde. Dal momento che probabilmente stai usando GNU sed, provate questo:

echo "ko05414  ko:ITGA4" | sed 's/\(^ko[0-9]\{5\}\)\tko:\(.*$\)/\1\2/' 
  • \ d -> [0-9] dal sed GNU non riconosce \ d
  • {} -> \ {\} poiché GNU sed di default usa espressioni regolari di base.
+2

questo mi dà lo stesso errore. Sono in OSX - non so come scoprire se sto usando GNU sed ... –

+7

@Mike Dewar - ooh, questa è un'informazione importante ... penso che OS X usi un sed simile a BSD, mentre è un opinione comune qui che la gente usa GNU sed –

+0

che è importante sapere! Grazie mille! –

9

Questo dovrebbe farlo. Puoi anche saltare l'ultimo gruppo e usare semplicemente, \1, ma poiché stai imparando sed e regex, questa è roba buona. Volevo utilizzare un gruppo non catturante nel mezzo (:?) ma non sono riuscito a farlo giocare con sed per qualsiasi motivo, forse non è supportato.

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

e naturalmente è possibile utilizzare

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

Grazie mille per questo! Ho svalutato la tua risposta perché l'hai completamente azzeccata, e la 's/ko: //' è ottima (anche se cosa fa quel backtick?). Sto dando il segno di spunta a ninjalj perché la sua risposta + commenti ha spiegato cosa stavo facendo male. Ma sto decisamente attaccando con 's/ko: //' o forse anche la stringa sostituita da getekha! Vedrò quale è più veloce ... –

+0

Il mio male, residuo da una variabile. Sì, lo darei anche a lui, in realtà si è preoccupato di spiegare. – Anders

5

Non c'è bisogno sed per questo

Ecco come si può fare con bash:

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

$ {var // "ko:"} sostituisce tutti "ko:" con ""

Vedi Manipulating Strings per ulteriori informazioni

+0

Leggi i commenti, ha detto che sta imparando sed. – Anders

+3

mentre io/io apprendo, questo approccio mi sembra brillante e semplice. Non avevo idea di questa sintassi. Tutta questa linea di comando fu è fantastica. –

+1

Errore mio, mi scuso con Getekha. – Anders

0

@OP, se si vuole solo sbarazzarsi di "Ko:", quindi

$ 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. Mentre è possibile utilizzare la sostituzione pura della stringa bash, è solo più efficiente quando si modifica una singola stringa. Se si dispone di un file, in particolare di un file di grandi dimensioni, l'uso di bash durante il ciclo di lettura è ancora più lento rispetto all'utilizzo di sed o awk.