2010-07-21 12 views
22

Mam wiele wierszy o postaciprzechwytywanie grupy z sed

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

i będzie drogo jak pozbyć KO: trochę kolumnie po prawej stronie. Próbuję użyć sed, jak następuje:

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

, który po prostu wyprowadza oryginalny ciąg I echo'd. Jestem bardzo początkującym skryptem wiersza poleceń, sed, rur itp., Więc proszę nie gniewać się zbytnio, jeśli/kiedy robię coś wyjątkowo głupiego.

Główną rzeczą, która mnie myli, jest to, że to samo dzieje się, gdy odwracam bit \1\2, aby przeczytać \2\1 lub po prostu użyć jednej grupy. To, jak sądzę, sugeruje, że brakuje mi czegoś o mechanizmie wyprowadzania wyniku echa do sed, lub że moje wyrażenie regularne jest błędne lub że używam sed źle lub że sed nie drukuje wyników substytucji .

Każda pomoc będzie bardzo ceniona!

+4

Dowolny powód, dla którego nie możesz użyć sed 's/ko \: // g'? – Anders

+0

jakikolwiek powód, dla którego nie używasz perla? :-P – eruciform

+4

nie znam Perla! ucząc się sed teraz. Nauczysz się perla i cokolwiek innego, kiedy to konieczne ... –

Odpowiedz

21

sed wyprowadza swoje wejście, ponieważ podstawienie nie jest pasujące. Ponieważ prawdopodobnie używasz GNU sed, spróbuj tego:

echo "ko05414  ko:ITGA4" | sed 's/\(^ko[0-9]\{5\}\)\tko:\(.*$\)/\1\2/' 
  • \ d -> [0-9], ponieważ SED GNU nie rozpoznaje \ d
  • {} -> \ {\} ponieważ GNU sed domyślnie używa podstawowych wyrażeń regularnych.
+2

nadal daje mi ten sam błąd. Jestem w OSX - nie wiem, jak się dowiedzieć, czy używam GNU sed ... –

+7

@Mike Dewar - ooh, to ważne informacje ... Myślę, że OS X używa BS-podobnego sed, podczas gdy jest to powszechne założenie, że ludzie używają GNU sed –

+0

, co jest ważne! Dzięki wielkie! –

9

To powinno wystarczyć. Możesz także pominąć ostatnią grupę i po prostu użyć, \1 zamiast tego, ale ponieważ uczysz się sed i regex, to jest dobre. Chciałem użyć niezapisującej grupy w środku (:?), ale nie mogłem tego zrobić, żeby grać z sed z jakiegokolwiek powodu, może nie jest to obsługiwane.

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

I oczywiście można użyć

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

Dziękuję bardzo za to! Poprawiłem twoją odpowiedź, ponieważ całkowicie ją przybiłeś, a "s/ko: //" jest świetne (chociaż co robi ten backtick?). Daję ci kleszcza do ninjalj, bo jego odpowiedź + komentarze wyjaśniła, co robiłem źle. Ale zdecydowanie trzymam się 's/ko: //', a może nawet ciąg zastępuje getekha! Zobaczę, który jest szybszy ... –

+0

Mój zły, pozostawiony ze zmiennej. Tak, dałbym mu go również, on naprawdę przeszkadzał, tłumacząc. – Anders

5

Nie trzeba sed dla tego

Oto jak można to zrobić z bash:

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

$ {var // "ko:"} zamienia wszystkie "ko:" na ""

Zobacz Manipulating Strings uzyskać więcej informacji

+0

Przeczytaj komentarze, powiedział, że uczy się sed. – Anders

+3

podczas I/am/learning sed, podejście to wydaje mi się genialny i prosty. Nie miałem pojęcia o tej składni. Cała ta linia poleceń jest niesamowita. –

+1

Mój błąd, przepraszam za getekhę. – Anders

0

@OP, jeśli po prostu chcesz się pozbyć "KO", następnie

$ 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 notatkę. Chociaż można użyć podstawienia czystym ciągiem bash, jest ono bardziej wydajne, gdy zmienia się pojedynczy ciąg znaków. Jeśli masz plik, szczególnie duży plik, używając basha, podczas gdy pętla odczytu jest wolniejsza niż przy użyciu sed lub awk.

Powiązane problemy