2010-07-21 26 views
22

Tôi có nhiều dòng dạngnhóm chụp trong sed

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

và thắm thiết muốn thoát khỏi ko: bit của cột bên tay phải. Tôi đang cố gắng sử dụng sed, như sau:

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

chỉ cần xuất ra chuỗi gốc mà tôi đã lặp lại. Tôi rất mới với dòng lệnh script, sed, pipe etc, vì vậy xin đừng quá tức giận nếu/khi tôi đang làm một cái gì đó cực kỳ ngu ngốc.

Điều chính gây nhầm lẫn cho tôi là điều tương tự cũng xảy ra nếu tôi đảo ngược bit \1\2 để đọc \2\1 hoặc chỉ sử dụng một nhóm. Điều này, tôi đoán, ngụ ý rằng tôi đang thiếu một cái gì đó về cơ học của đường ống đầu ra của echo vào sed, hoặc regexp của tôi là sai hoặc tôi đang sử dụng sed sai hoặc sed đó không in kết quả của sự thay thế .

Bất kỳ trợ giúp nào sẽ được đánh giá rất nhiều!

+4

Bất kỳ lý do nào bạn không thể sử dụng sed 's/ko \: // g'? – Anders

+0

bất kỳ lý do nào khiến bạn không sử dụng perl? :-P – eruciform

+4

không biết Perl! học sed ngay bây giờ. Sẽ học perl, và bất cứ điều gì khác, như và khi cần thiết ... –

Trả lời

21

sed sẽ xuất đầu vào của nó vì thay thế không khớp. Kể từ khi có lẽ bạn đang sử dụng GNU sed, hãy thử này:

echo "ko05414  ko:ITGA4" | sed 's/\(^ko[0-9]\{5\}\)\tko:\(.*$\)/\1\2/' 
  • \ d -> [0-9] từ sed GNU không nhận \ d
  • {} -> \ {\} vì GNU sed theo mặc định sử dụng các biểu thức chính quy cơ bản.
+2

điều này vẫn mang lại cho tôi cùng một lỗi. Tôi đang ở OSX - không chắc chắn làm thế nào để tìm hiểu xem tôi đang sử dụng GNU sed ... –

+7

@Mike Dewar - ooh, đó là thông tin quan trọng ... tôi nghĩ OS X sử dụng một BSD giống như sed, trong khi đó là một giả định chung ở đây là mọi người sử dụng GNU sed –

+0

điều quan trọng cần biết! Cám ơn rất nhiều! –

9

Điều này nên thực hiện. Bạn cũng có thể bỏ qua nhóm cuối cùng và chỉ cần sử dụng, \1 thay vào đó, nhưng vì bạn đang học sed và regex đây là công cụ tốt. Tôi muốn sử dụng một nhóm không chụp ở giữa (:?) nhưng tôi không thể có được để chơi với sed vì lý do gì, có lẽ nó không được hỗ trợ.

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

Và ofcourse bạn có thể sử dụng

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

Cảm ơn bạn rất nhiều vì điều này! Tôi đã upvoted câu trả lời của bạn bởi vì bạn đã hoàn toàn đóng đinh này, và của/ko: // 'là rất tốt (mặc dù backtick đó là gì?). Tôi đưa dấu tích cho ninjalj cos câu trả lời của anh ấy + bình luận đã giải thích những gì tôi đã làm sai. Nhưng tôi chắc chắn gắn bó với 's/ko: //' hoặc thậm chí là chuỗi thay thế bằng getekha! Tôi sẽ thấy cái nào nhanh hơn ... –

+0

Cái xấu của tôi, còn sót lại từ một biến. Tôi cũng sẽ đưa nó cho anh ấy, anh ấy thực sự bực mình giải thích. – Anders

5

Bạn không cần sed cho điều này

Đây là cách bạn có thể làm điều đó với bash:

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

$ {var // "ko:"} thay thế tất cả "ko:" bằng ""

Xem Manipulating Strings để biết thêm

+0

Đọc các ý kiến, ông nói rằng ông đang học sed. – Anders

+3

trong khi tôi/am/học sed, cách tiếp cận này đánh tôi như là rực rỡ và đơn giản. Tôi không biết gì về cú pháp này. Tất cả dòng lệnh fu này đều tuyệt vời. –

+1

Sai lầm của tôi, tôi xin lỗi getekha. – Anders

0

@OP, nếu bạn chỉ muốn thoát khỏi "ko:", sau đó

$ 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 một lưu ý. Mặc dù bạn có thể sử dụng thay thế chuỗi bash thuần túy, nhưng nó chỉ hiệu quả hơn khi bạn thay đổi một chuỗi. Nếu bạn có một tập tin, đặc biệt là một tập tin lớn, sử dụng bash trong khi đọc vòng lặp vẫn còn chậm hơn so với sử dụng sed hoặc awk.

Các vấn đề liên quan