2013-05-27 11 views
27

Tôi đang cố gắng sử dụng SED thông qua OS X Terminal để thực hiện tìm và thay thế.Làm cách nào để sử dụng SED để tìm và thay thế chuỗi URL bằng ký tự "/" trong chuỗi được nhắm mục tiêu?

Hãy tưởng tượng tôi có chuỗi này rải rác khắp các tập tin văn bản: http://www.find.com/page

Và tôi muốn thay thế nó với chuỗi này: http://www.replace.com/page

Tôi đang gặp rắc rối vì tôi không chắc chắn làm thế nào để thoát đúng cách hoặc sử dụng ký tự "/" trong chuỗi của tôi. Ví dụ nếu tôi chỉ đơn giản muốn tìm "mèo" và thay thế bằng "con chó" Tôi đã tìm thấy các lệnh sau đây mà làm việc một cách hoàn hảo:

sed -i '' 's/cat/dog/g' file.txt 

Có ai có bất kỳ ý tưởng về làm thế nào để đạt được các chức năng tương tự chỉ thay vì mèo và chó có chuỗi hoặc URL chứa ký tự "/"? Tôi đã thử nhiều cách khác nhau để thoát khỏi các ký tự "/" nhưng sau đó nó có vẻ như là nếu SED không còn có thể "tìm thấy" chuỗi và nó không thực hiện bất kỳ tìm thấy hành động thay thế &.

Bất kỳ trợ giúp hoặc mẹo nào được đánh giá cao.

Cảm ơn!

Trả lời

73

/ không phải là số dấu phân tách trong các lệnh sed, đây chỉ là một trong những lệnh có thể. Ví dụ này, bạn có thể sử dụng ví dụ , thay vì nó không xung đột với các chuỗi của bạn;

echo 'I think http://www.find.com/page is my favorite' | 
    sed 's,http://www.find.com/page,http://www.replace.com/page,g' 
+0

Khả năng hỗ trợ dấu phân cách tùy chỉnh của Sed làm cho mọi việc ít phức tạp hơn. Cảm ơn @ Joachim! –

22

sed có thể thực hiện bất kỳ điều gì theo "s" làm dấu phân cách. Vì bạn đang làm việc với URL, thực hành tốt là sử dụng dấu phân cách khác với / để không nhầm lẫn sed khi thay thế của bạn kết thúc và thay thế bắt đầu.

Tuy nhiên, đã nói rằng bạn chắc chắn có thể sử dụng / nếu bạn muốn. Bạn chỉ cần thoát khỏi chữ số /.

Vì vậy, bạn có thể làm:

sed 's/http:\/\/www.find.com\/page/http:\/\/www.replace.com\/page/g' input_file 

hoặc sử dụng một delimiter khác nhau để tránh làm khó hiểu của bạn sed khó hiểu hơn.

sed 's#http://www.find.com/page#http://www.replace.com/page#g' input_file 
+0

Tôi thích ý tưởng phân cách khác nhau –

+0

Sử dụng phương pháp này, bất kỳ lý do nào sau đây chỉ xuất ra tệp mà không có bất kỳ thay đổi nào? 'sed 's #: 0.0.1 #: new-build-number # g' some.yaml'. 1. Thay đổi không xảy ra. 2. Tôi không muốn các tập tin in, chỉ cần cập nhật. –