2013-03-03 42 views
8

Tôi đang cố gắng thay thế một biểu thức bằng cách sử dụng sed. Các regex hoạt động trong vim nhưng không phải trong sed. Tôi đang thay thế các dấu gạch ngang cuối cùng trước khi số với một dấu gạch chéo đểCác tham chiếu trong sed trả về giá trị sai

/www/file-name-1 

nên trở

/www/file-name/1 

Tôi đang sử dụng lệnh sau nhưng nó vẫn không ngừng xuất ra/www/file-name/0 thay vì

sed 's/-[0-9]/\/\0/g' input.txt 

Tôi đang làm gì sai?

Trả lời

15

Bạn phải bao quanh giữa ngoặc dữ liệu để tham khảo sau này, và sed bắt đầu đếm trong 1. Để khôi phục tất cả các nhân vật phù hợp mà không cần dấu ngoặc đơn, nó được sử dụng biểu tượng &.

sed 's/-\([0-9]\)/\/\1/g' input.txt 

Đó suất:

/www/file-name/1 
+0

Đây là câu trả lời đúng. Tôi không nhận thấy @ user2052491 không sử dụng dấu ngoặc đơn. – maljub01

+0

các dấu gạch chéo ngược trước khi niềng răng là không cần thiết, phải không? – Blauhirn

0

Nó dường như sed dưới OS X bắt đầu đếm backreferences tại 1. Hãy thử \1 thay vì \0

+0

nếu tôi sử dụng \ 1 nó trả về "\ 1 không được xác định trong RE" – user2052491

+0

OS X/macOS có công cụ UNIX cổ đại. Bạn không thể sử dụng '-r' có nghĩa là bạn cần phải thoát khỏi dấu ngoặc đơn. –

+0

HĐH của OS X sử dụng -E thay vì -r để bật mở rộng regex – thenickdude

5

Bạn cần phải nắm bắt sử dụng dấu ngoặc đơn trước khi bạn có thể sao tham khảo (mà bắt đầu một \1). Hãy thử sed -r 's|(.*)-|\1/|':

$ sed -r 's|(.*)-|\1/|' <<< "/www/file-name-1" 
/www/file-name/1 

Bạn có thể sử dụng bất kỳ dấu phân cách với sed nên / không phải là lựa chọn tốt nhất khi thay chứa /. Tùy chọn -r dành cho regexp mở rộng do đó dấu ngoặc đơn không cần phải được thoát.

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