2012-01-23 26 views
5

Tôi đã viết một tập lệnh bash có thể sửa đổi php.ini theo nhu cầu của tôi.
Bây giờ tôi phải giới thiệu một thay đổi mới, và tôi không thể tìm ra giải pháp rõ ràng cho nó.

Tôi cần phải sửa đổi php.ini để chèn (nếu chưa được chèn trước đó)
Làm thế nào để chèn một dòng trong một tệp giữa hai khối các dòng đã biết (nếu chưa được chèn trước đó), sử dụng bash?

extension="memcache.so" 


giữa khối

;;;;;;;;;;;;;;;;;;;;;; 
; Dynamic Extensions ; 
;;;;;;;;;;;;;;;;;;;;;; 

và khối

;;;;;;;;;;;;;;;;;;; 
; Module Settings ; 
;;;;;;;;;;;;;;;;;;; 

có thể ngay trước thẻ thứ hai.
Có ai giúp tôi không? Cảm ơn trước

EDITED: giải quyết bằng cách sử dụng

if ! grep -Fxq 'extension="memcache.so"' 'php.ini'; then 
    line=$(cat 'php.ini' | grep -n '; Module Settings ;' | grep -o '^[0-9]*') 
    line=$((line - 2)) 
    sudo sed -i ${line}'i\extension="memcache.so"' 'php.ini' 
fi 

Trả lời

6

Lấy số dòng sử dụng grep -n:

line=$(cat php.ini | grep -n 'Module Settings' | grep -o '^[0-9]*') 

Tính dòng để chèn văn bản để:

line=$((line - 3)) 

Chèn nó bằng cách sử dụng sed hoặc awk. Ví dụ để chèn "xuống dòng" trên dòng 45:

sed '45i\newline' file 
awk 'NR==45{print "newline"}1' 
+0

Cảm ơn bạn đã giải quyết bằng cách sử dụng (xem đã chỉnh sửa) –

2

Bạn có thể sử dụng kịch bản sed sau:

/^;\+$/{ 
N 
/^;\+\n; Module Settings ;$/i extension="memcache.so" 
} 

Về cơ bản nó phù hợp với những dòng này:

;;;;;;;;;;;;;;;;;;; 
; Module Settings ; 

và chèn trước khi họ chuỗi mong muốn (extension="memcache.so")

+0

xin lỗi, tôi không thể hiểu cách sử dụng đề xuất của bạn. Đó sẽ là lệnh để bắn? –

+0

@LucaBorrione Lưu tập lệnh trong một tệp và thực thi 'sed -f php.ini'. Điều này sẽ in ra stdout, nếu bạn muốn thực hiện các thay đổi tại chỗ, hãy sử dụng '-i'. – jcollado

+0

Cảm ơn bạn nó hoạt động tốt. Không bao giờ làm một điều như vậy trước đây. Người ta không bao giờ dừng lại để tìm hiểu. Một lời cảm ơn tuyệt vời! –

4

Điều này có thể phù hợp với bạn:

sed '/^; Dynamic Extensions ;$/,/^; Module Settings ;$/{H;//{x;/extension="memcache.so"/{p;d};/;;;\n/{s//&extension="memcache.so"\n/p}};d}' file 

này sẽ chèn extension="memcache.so" giữa ; Dynamic Extensions ;; Module Settings ; trừ extension="memcache.so" đã hiện diện.

+0

Rất tốt, cảm ơn bạn. Nhưng dù sao, trong ví dụ cụ thể này, tôi cần thêm 'extension =" memcache.so "' trừ khi phần mở rộng tương tự chưa được thêm vào trước ... các phần mở rộng khác có thể là (và thực sự là). –

+0

Tôi nghĩ rằng bạn có nghĩa là "... _if_ phần mở rộng tương tự chưa được thêm trước". Đã sửa đổi giải pháp để phản ánh nhận xét của bạn. – potong

+0

xin lỗi! Có: đó là những gì tôi có nghĩa là :) .. mã của bạn bây giờ là thêm 'extension =" memcache.so "' tất cả các lần ngay cả khi đã có mặt .. –

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