2013-04-15 22 views
5

Trong trường hợp cụ thể của tôi, tôi cần lặp qua hàng trăm tệp có chứa biến lưu trữ URL. Tất cả các URL khác nhau, nhưng vì lợi ích của ví dụ này chúng ta có thể cho rằng họ kết thúc bằng 'com "'Cách sử dụng sed để thay thế mẫu trong tệp chỉ trong các dòng có chứa mẫu khác

tôi cần phải thêm một số văn bản ngay sau com

Bởi vì tất cả các URL sẽ có lĩnh vực khác nhau tôi không thể sử dụng một lệnh sed như:

sed -i 's/^ENVIRONMENT="someurl.com"/ENVIRONMENT="someurl.com.origin.net"/g'

Bởi vì các tập tin chứa các dòng khác có thể chứa com, tôi không thể sử dụng một cái gì đó như:

sed -i 's/com/com.origin.net/g'

tôi cần phải làm tìm kiếm này và chỉ thay thế trên một dòng cụ thể có chứa một mô hình, chẳng hạn như từ ví dụ của tôi dưới đây trong regex:

^ENVIRONMENT.*

Nếu tôi có thể tập trung sử dụng sed chỉ vào dòng phù hợp với mô hình trên thì tôi có thể sử dụng một số thích nghi của sed như sed -i 's/com/com.origin.net/g'. Dĩ nhiên tôi có thể viết một kịch bản bash quá phức tạp để làm điều này, nhưng tôi biết có một cách tốt đẹp để nói với sed để tìm một mẫu, chỉ làm việc trên dòng mà mẫu được tìm thấy, và tìm kiếm và thay thế một mẫu khác với một chuỗi mới.

Trong tìm kiếm của Google, chỉ có liên kết bán có liên quan tôi thấy về vấn đề này là:

https://unix.stackexchange.com/questions/37518/how-to-sed-only-that-lines-that-contains-given-string

nhưng nó không đủ trả lời câu hỏi của tôi. Cũng có thể hạn chế sed nói chung chỉ là một dòng phù hợp với một mô hình sẽ bởi một công cụ tốt đẹp để thêm vào tôi sed kho vũ khí.

Bất kỳ trợ giúp nào dẫn đến giải pháp ở đây sẽ rất được đánh giá cao.

Dưới đây là một ví dụ về một tập tin

### Example File
#
#
# someurl.com

ENVIRONMENT="someurl.com"

Tôi muốn thay thế 'MÔI TRƯỜNG = "someurl .com "' với 'MÔI TRƯỜNG = 'someurl.com.orign.net''

tôi có lẽ sẽ chèn lệnh sed có nguồn gốc từ bài này trong kịch bản shell một dòng như:

' cho f trong * .config; làm File2BeEdited = $ (cat $ f | grep^PatternToIdentifyLine | grep -v RemoveLinesThatAreAlreadyCorrect); nếu ["$ File2BeEdited"! = ""]; sau đó RunSedCommand; printf "\ nTìm một tệp cần chỉnh sửa.\ NRunning sed trên $ f >> log.log "; thực hiện

Vì vậy, tôi có thể lặp qua mỗi tập tin cấu hình trong một thư mục và chọn lọc thực hiện thay đổi này

Trả lời

9

Các dòng lệnh sau đây cho thấy hai giải pháp khả thi: Bạn có thể hạn chế việc thay đổi để một số dòng với /regex/. Và bạn có thể sử dụng các văn bản phù hợp trong thay thế với \0, \1 vv

sed -e '/^\(ENVIRONMENT="[^"]*\.com\)"/s//\1.origin.net"/' 
+0

Cảm ơn này là chính xác những gì tôi muốn đạt được. Đặc biệt là có thể chèn văn bản phù hợp. Chỉ cần làm rõ sự hiểu biết của tôi về khía cạnh thay thế văn bản phù hợp của câu trả lời bạn đã cung cấp; những gì tôi có thể thực hiện với \ 0? Ngoài ra, nếu tôi sử dụng \ 2 ví dụ, chèn này có thể nói văn bản được so khớp thứ hai từ regex hay không. Ví dụ: nếu tôi đang tìm kiếm một dòng có 2 mẫu phù hợp. – Matthew

+1

Hãy xem hướng dẫn sử dụng GNU sed: [backreferences trong biểu thức chính quy] (http://www.gnu.org/software/sed/manual/sed.html#index-Backreferences_002c-in-regular-expressions-103) – nosid

+0

Bạn đang sử dụng những gì 'sed' gọi địa chỉ? – Geremia

-2

bạn có thể làm điều đó với gvim ..

: g/^ baz/s/foo/bar/g

giải thích: trong tất cả các dòng bắt đầu bằng baz, thay thế tất cả các lần xuất hiện của foo bằng thanh.

séc http://vim.wikia.com/wiki/Search_and_replace để biết thêm chi tiết ..

+2

OP yêu cầu một giải pháp trong 'sed'; đây không phải là sed. –

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