2013-02-01 25 views
8

Tôi có yêu cầu trong đó tôi cần phải thay đổi nội dung của tệp có tên là xyz.cfg. tệp chứa các giá trị như:Thay đổi nội dung của tệp thông qua tập lệnh shell

group address=127.8.8.8 
port=7845 
Jboss username=xyz_ITR3 

Tôi muốn thay đổi nội dung này khi cần thiết thông qua tập lệnh trình bao và lưu tệp. Nội dung đã thay đổi có thể trông giống như:

group address=127.8.7.7 
port=7822 
Jboss username=xyz_ITR4 

Làm cách nào để đạt được điều này bằng cách sử dụng tập lệnh shell bằng cách nhập liệu người dùng hay cách khác?

+0

Bạn nên đặt một câu hỏi cụ thể cho một vấn đề cụ thể. Vì Stack Overflow ẩn lý do Close từ bạn: * "Các câu hỏi yêu cầu chúng tôi đề xuất hoặc tìm sách, công cụ, thư viện phần mềm, hướng dẫn hoặc tài nguyên ngoài trang web khác không có chủ đề cho Stack Overflow vì chúng có xu hướng thu hút câu trả lời và spam Thay vào đó, mô tả vấn đề và những gì đã được thực hiện cho đến nay để giải quyết nó. "* – jww

Trả lời

23

Làm thế nào về một cái gì đó như:

#!/bin/bash 

addr=$1 
port=$2 
user=$3 

sed -i -e "s/\(address=\).*/\1$1/" \ 
-e "s/\(port=\).*/\1$2/" \ 
-e "s/\(username=\).*/\1$3/" xyz.cfg 

đâu $1,$2$3 là các đối số truyền cho script. Lưu nó một tập tin như script.sh và chắc chắn rằng nó thực thi với chmod +x script.sh sau đó bạn có thể chạy nó thích:

$ ./script.sh 127.8.7.7 7822 xyz_ITR4 

$ cat xyz.cfg 
group address=127.8.7.7 
port=7822 
Jboss username=xyz_ITR4 

này cho phép bạn cấu trúc cơ bản tuy nhiên bạn sẽ muốn suy nghĩ về việc chứng thực đầu vào vv.

+1

Điều này hoạt động hoàn hảo theo những gì tôi cần!cảm ơn – user2031888

7
sed -i 's/something/other/g' filename.txt 

sẽ sửa filename.txt tại chỗ, và thay đổi từ 'cái gì đó' thành 'khác'

Tôi nghĩ -i có thể là một phần mở rộng GNU Mặc dù vậy, nhưng nếu đó là OK cho bạn, bạn có thể thêm nó qua tìm, xargs, vv

Nếu bạn muốn thay đổi nó trong một kịch bản shell, bạn có thể tranh cãi trên dòng lệnh và tham khảo chúng bằng số, ví dụ: $ 1

Edit:

Theo nhận xét của tôi, câu trả lời của sudo_O dưới đây là chính xác ví dụ mà bạn muốn. Những gì tôi sẽ thêm là nó phổ biến mà bạn sẽ muốn làm như vậy phù hợp với nhiều tập tin, mở rộng thư mục con vv, do đó, nhận biết find/xargs, và bạn có thể kết hợp cả hai. Một ví dụ đơn giản của tiếng nói thay đổi subnet trong một loạt các file cfg có thể là:

find -name '*.cfg' -print0 | xargs -0 -I {} sed -ie 's/\(192.168\)\.1/\1\.7/' {} 

Lưu ý print0/-0 args để tìm/xargs (rất hữu ích cho đường dẫn/tên tập tin với không gian), và rằng bạn phải thoát khỏi dấu ngoặc bắt vì vỏ (cùng trong ví dụ sudo của)

+0

> cùng với các dòng khác tôi có vài dòng hơn mà sẽ vẫn không đổi trong tập tin mới. Vậy làm cách nào để tôi đặt nội dung mới này cùng với nội dung cũ? – user2031888

+0

Tôi sắp thêm một ví dụ dọc theo dòng của sudo_O, nhưng câu trả lời của anh ấy là đi; phù hợp/chụp "chìa khóa" bạn quan tâm, và để những người khác không thay đổi – herdingofthecats

8

*

#! /bin/sh 
file=xyz.cfg 
addr=$1 
port=$2 
username=$3 
sed -i 's/address=.*/address='$addr'/' $file 
sed -i 's/port=.*/port='$port'/' $file 
sed -i 's/username=.*/username='$username'/' $file 

*

Tôi hy vọng điều này sẽ được đơn giản để hiểu cho người mới bắt đầu

+0

Cảm ơn vì điều này, không bao giờ được sử dụng sed trước và không có ý tưởng những gì đang xảy ra trong câu trả lời được chấp nhận –

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