Làm thế nào để sử dụng Sed để thay thế tất cả các ký tự trước dấu hai chấm?


25

Làm cách nào để thay thế chuỗi sau đây

hd_ma_prod_customer_ro:*:123456789:john.doe

với john.doe

Về cơ bản tôi cần tìm dấu hai chấm cuối (:) và xóa mọi thứ trước đó và bao gồm nó.

Câu trả lời:


40

Giả sử điều bạn thực sự muốn nói là bạn muốn xóa mọi thứ cho đến dấu hai chấm cuối cùng và để john.doenguyên vẹn:

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
  sed 's/.*://'

Giải trình:

Dòng đầu tiên chỉ dẫn các chuỗi thử nghiệm sedcho các mục đích ví dụ.

Thứ hai là một sedsự thay thế cơ bản . Phần giữa thứ nhất và thứ hai /là regex để tìm kiếm và phần giữa thứ hai và thứ ba là những gì để thay thế nó (không có gì trong trường hợp này khi chúng tôi đang xóa).

Đối với regex, .khớp với bất kỳ ký tự nào, *lặp lại số lần này (bao gồm 0) và :khớp với dấu hai chấm. Vì vậy, hiệu quả của nó là bất cứ điều gì theo sau một dấu hai chấm. Vì .*có thể bao gồm một dấu hai chấm, trận đấu là 'tham lam' và mọi thứ cho đến dấu hai chấm cuối cùng được bao gồm.


7
sed -r 's/:/\t/g' filename | awk -F'\t' '{print $4}'

Tôi đang thay thế tất cả các lần xuất hiện của : bằng một tab và sau đó sử dụng awkđể trích xuất chuỗi john.doe.

Nếu bạn không có tập tin, bạn có thể thử nó.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | 
awk -F'\t' '{print $4}'

Theo nhận xét của Graeme, chúng tôi có thể sử dụng awkđể in cột cuối cùng bằng cách sử dụng NFbiến awknhư dưới đây.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | awk -F'\t' '{print $NF}'

Kết hợp các ý kiến ​​của Graeme để loại bỏ những thứ không cần thiết sed

Lệnh có thể được sửa đổi như dưới đây.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | awk -F':' '{print $NF}'

1
Nếu bạn sẽ sử dụng awk, tại sao không làm awk -F:?
Graeme

@Graeme, tôi vẫn không thoải mái awk. Về cơ bản, tôi cố gắng kiểm tra các lệnh mà ban đầu tôi nhận được trong câu trả lời của mình và cố gắng sửa đổi chúng theo yêu cầu của người dùng. :)
Ramesh

3
Các -Flựa chọn cho awkquy định cụ thể tách lĩnh vực. Nếu bạn bảo awksử dụng dấu hai chấm, không cần thay dấu hai chấm bằng tab. Ngoài ra, nếu bạn muốn lấy trường cuối cùng bạn có thể sử dụng $NFthay vì $4, trường này sẽ hoạt động nếu không phải lúc nào cũng có 3 dấu hai chấm.
Graeme

@Graeme, tôi đã kết hợp những thay đổi bạn đã đề cập. Xin vui lòng cho tôi biết nếu điều này là tốt :)
Ramesh

Vâng, hoạt động hoàn hảo!
Graeme


2

Vui lòng thử

chỉnh sửa: loại bỏ neo

echo 'abc:fjk' |sed 's/.*:/john.doe/g'

và xóa

echo 'abc:fjk' |sed 's/.*://g'

đó không phải là những gì OP yêu cầu
iruvar

xin vui lòng đọc lại câu hỏi một lần nữa.
akash

Chà, bạn đã xóa trong phần xóa sau bình luận của tôi, đừng
bận

oh tôi hiểu rồi lời xin lỗi của tôi 1_CR
akash

1
Các ^neo làm cho không có sự khác biệt trong trường hợp một trong hai của câu hỏi hoặc trong trường hợp ví dụ của bạn. Bất kỳ địa chỉ bắt đầu với /.*đã ngụ ý ^.
mikeerv
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.