Để hiểu làm thế nào để làm điều này, bạn cần phải hiểu như thế nào vỏ là rối tung với dấu ngoặc kép và dấu xồ nguợc của bạn cũng như liệu sed
đang rối tung với họ.
Nói chung, dễ nhất trong trình bao để sử dụng dấu nháy đơn - ngoại trừ khi regex phải khớp với dấu nháy đơn. Không có ký tự đặc biệt nào trong dấu nháy đơn; trích dẫn đơn tiếp theo kết thúc nó. Dấu nháy kép khó hơn nhiều; dấu gạch chéo ngược và đô la và dấu ngoặc kép là tất cả đặc biệt.
Yêu cầu đầu tiên được xử lý tốt nhất bằng một single trích dẫn sed
biểu:
Thay đổi:
[server]
server[] = "localhost:11211"
để
[server]
server[] = "localhost:11211"
server[] = "localhost:11212"
Đối với điều này, chúng ta có thể sử dụng:
-e '/^server\[] = "localhost:11211"/{p;s/11211/11212/}'
Vỏ chỉ đơn giản gửi mọi thứ bên trong dấu ngoặc đơn đến sed
, không bị ảnh hưởng. Ký tự đặc biệt duy nhất cho sed
là dấu ngoặc vuông mở. Điều đó sẽ bắt đầu một lớp nhân vật ngoại trừ dấu gạch chéo ngược trước nó. Dấu ngoặc vuông gần chỉ là đặc biệt khi bạn đang ở trong một lớp nhân vật, vì vậy nó không cần phải thoát. Các hành động để nhận biết dòng đó là in bản gốc, sau đó thực hiện 11212 để thay thế 11211; in mặc định sẽ in dòng đã sửa đổi.
Phần khác phức tạp hơn một chút. Bởi vì các mẫu có chứa dấu nháy đơn, chúng ta sẽ sử dụng tốt nhất các dấu ngoặc kép xung quanh regex.
Thay đổi:
define('ADMIN_USERNAME','username'); // Admin Username
define('ADMIN_PASSWORD','password'); // Admin Password
$MEMCACHE_SERVERS[] = 'mymemcache-server1:11211'; // add more as an array
$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array
tới:
define('ADMIN_USERNAME','myusername'); // Admin Username
define('ADMIN_PASSWORD','mypassword'); // Admin Password
$MEMCACHE_SERVERS[] = 'localhost:11211'; // add more as an array
$MEMCACHE_SERVERS[] = 'localhost:11212'; // add more as an array
Hai dòng đầu tiên có thể là trí trên bản đồ sử dụng một regex duy nhất:
-e "s/^\(define('ADMIN_[A-Z]\{0,8\}','\)\([^']*'\)/\1my\2/"
này chụp hai phần - define('ADMIN_USERNAME','
là \1
và username'
là \2
và địa điểm thay thế my
giữa hai phần. Điều này không quá tệ; vỏ không làm bất cứ điều gì đặc biệt với bất kỳ ký tự nào, vì vậy bạn chỉ cần gõ những gì bạn muốn sed
để xem bên trong dấu ngoặc kép.
Hai dòng cuối cùng thì rắc rối hơn:
-e "s/^\(\$MEMCACHE_SERVERS\[] = '\)[^:]*\(:[0-9]*'\)/\1localhost\2/"
Tuy nhiên, không phức tạp hơn nhiều; bạn chỉ cần dừng trình bao mở rộng $MEMCACHE_SERVERS
làm biến hệ vỏ, đó là lý do tại sao có dấu gạch chéo ngược ở phía trước của $
. Khung hình vuông cần bảo vệ từ sed
như trước đây. Regex khớp với mọi thứ không phải là dấu hai chấm và thay thế bằng localhost
.
Vì vậy, kịch bản này nên làm việc:
sed -e '/^server\[] = "localhost:11211"/{p;s/11211/11212/}' \
-e "s/^\(define('ADMIN_[A-Z]\{0,8\}','\)\([^']*'\)/\1my\2/" \
-e "s/^\(\$MEMCACHE_SERVERS\[] = '\)[^:]*\(:[0-9]*'\)/\1localhost\2/" \
"[email protected]"
Tuy nhiên, tôi đã chỉ giải thích lý do tại sao nó phải làm việc; Tôi đã không chứng minh rằng nó hoạt động!
Câu trả lời hay nhất theo ý kiến của tôi. – wind39