2011-12-22 36 views
11

Tiêu đề cho biết tất cả. tôi cần phải thay thế một giá trị tài sản mà tôi không biết đến một giá trị khác. tôi đang cố gắng này:Chỉnh sửa giá trị thuộc tính trong tệp thuộc tính từ tập lệnh shell

#!/bin/bash 
sed -i "s/myprop=[^ ]*/myprop=$newvalue/g" file.properties 

tôi nhận được sed: -e expression #1, char 19: unknown option to s'`

Tôi nghĩ vấn đề là $newvalue là một chuỗi đại diện cho một thư mục để nó messes lên sed.

Tôi có thể làm gì?

+3

'/ 'chỉ là dấu phân cách thông thường (nhưng không bắt buộc) cho' sed'. Điều gì xảy ra nếu bạn thử cái gì khác, như ống ('|')? –

+0

@DanFego đã làm việc! tôi mất nhiều thời gian để nhận ra rằng '/' trong chuỗi var của tôi là vấn đề. quên rằng bạn có thể chuyển đổi dấu phân cách sed. cảm ơn bạn – Michael

+1

Tại sao bạn sử dụng công cụ sửa đổi 'g'? – fge

Trả lời

7

sed có thể sử dụng các ký tự khác hơn / làm dấu phân cách, mặc dù / là phổ biến nhất. Khi xử lý những thứ như tên đường dẫn, thay vào đó hãy sử dụng một cái gì đó giống như đường ống (|).

+0

đối với một số seds, bạn sẽ cần phải 'thoát' trường hợp đầu tiên của một dấu phân cách không chuẩn reg-ex, như 's \ | srch | repl |'. Chúc mọi người may mắn. – shellter

7

Nếu tập tin tài sản của bạn được giới hạn với = dấu hiệu như thế này -

param1=value1 
param2=value2 
param3=value3 

sau đó bạn có thể sử dụng awk làm modifiy giá trị param bằng cách chỉ biết tên param. Ví dụ, nếu chúng ta muốn thay đổi param2 trong tập tin tài sản của bạn, chúng ta có thể làm như sau -

awk -F"=" '/param2/{$2="new value";print;next}1' filename > newfile 

Bây giờ, trên one-liner đòi hỏi bạn phải cứng mã giá trị mới của param. Đây có thể không phải là trường hợp nếu bạn đang sử dụng nó trong một kịch bản lệnh shell và cần lấy giá trị mới từ một biến.

Trong trường hợp đó, bạn có thể làm như sau -

awk -F"=" -v newval="$var" '/param2/{$2=newval;print;next}1' filename > newfile 

Trong này, chúng tôi tạo ra một awk biến newval và khởi tạo nó với kịch bản biến của bạn ($ var), trong đó có giá trị tham số mới.

+0

Điều gì sẽ xảy ra nếu tôi muốn thêm một dòng mới vào cuối nếu thuộc tính không tồn tại? –

+0

Tôi đã thử lệnh 'awk' được nêu ra nhưng nó tách '=' ra khỏi đầu ra để kết thúc chuyển đổi 'HOSTNAME = oldvalue' thành' HOSTNAME newvalue' - bất kỳ ý tưởng nào tôi đã sai? –

+1

@Oly Bạn sẽ cần đặt biến OFS. Vì vậy, 'awk -F' = '-v OFS =' = '... ' –

0

Tôi tìm thấy một hàm từ một người có tên Kongchen. Ông đã viết một kịch bản chức năng để thay đổi giá trị tài sản và nó làm việc tốt cho tôi:

Check it out: https://gist.github.com/kongchen/6748525

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