Thêm một dòng văn bản vào nhiều tệp


10

Vì vậy, tôi có một loạt các tệp trong một thư mục và tôi cần chèn một dòng văn bản vào mỗi tệp. Chúng có định dạng cơ bản sau:


<VirtualHost *:80>
        ServerAdmin gabe@localhost
        DocumentRoot /var/www/test1
        ServerName test1.local
        ServerAlias test1
        <Directory "/var/www/test1">
                Options All
                AllowOverride All
        </Directory>
</VirtualHost>

Và tôi muốn chèn một dòng trước khi kết thúc

</ Virtualhost>
nhãn. Giả định đầu tiên của tôi là tôi sẽ có thể làm điều này với sed, có thể phù hợp và thay thế thẻ đó. Tôi sẽ bắt đầu thử điều này ngay bây giờ, nhưng nếu bất cứ ai có một cách hiện có để làm điều này, tôi rất muốn nghe nó.


Tôi sẽ thành thật khi tôi nói rằng tôi nghĩ đây là một nhiệm vụ lập trình nhiều hơn ... và do đó nên có trên SO. Tôi sẽ sử dụng Perl để làm điều đó, đặc biệt vì tôi cá là có một mô-đun perl được thiết kế để phân tích cú pháp và sửa đổi cấu hình apache.
xenoterracide

2
Cảm ơn, nhưng đó là một nhiệm vụ dễ thực hiện với các công cụ unix đơn giản, do đó được hỏi ở đây. Cảm ơn bình luận của bạn, mặc dù.
gabe.

Câu trả lời:


10

Một cái gì đó như thế này:

sed 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/'

làm. Nếu bạn muốn lặp lại lệnh này trên nhiều tệp, bạn có thể làm một cái gì đó như:

for i in *; do sed -i 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/' "$i"; done

Có lẽ tốt hơn (nhưng chưa được kiểm tra) nhờ @ChrisDown:

find . -type f -print0 | while IFS= read -r -d '' filename;\
do sed -i 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/' $filename;\ 
done

tuyệt vời ... đây chỉ là những gì tôi đang tìm kiếm.
gabe.

1
Đừng không phân tích ls. Sử dụng một quả cầu thay thế. mywiki.wooledge.org/ParsingLs
Chris Down

Bạn thật cứng nhắc @ChrisDown. Xin vui lòng, cải thiện câu trả lời của tôi.
lcipriani

Chọn một ký tự khác với /biểu thức sed là sạch hơn, vì bạn không phải thoát khỏi dấu gạch chéo:'s:</VirtualHost>:yourlinehere\n</VirtualHost>:'
Alexander

2

Nếu bạn không phiền Perl hãy thử:

perl -pi'*.old' -e 's(</VirtualHost>(Your stuff here\n</VirtualHost>)' myfile

Công -itắc sẽ lưu tệp cũ của bạn bằng một .oldphần mở rộng và in ra tệp hiện tại.


2

Bạn cũng có thể sử dụng "ex" (dòng lệnh vi) nếu việc chỉnh sửa bạn muốn thực hiện thậm chí hơi phức tạp. Ví dụ: bạn chỉ muốn thực hiện thao tác chèn cho một trường hợp "".

Một kịch bản shell như thế này có thể hoạt động:

for FILENAME in *.whatever  # Need a criteria to glob, or a list of names
do
    ex -s $FILENAME << END_EDITS
/^<\/VirtualHost>/
O " capital-o, not zero
text to insert goes here
.
w!
q
END_EDITS
done

Cách tiếp cận này cung cấp cho bạn những lợi thế của "ex": tìm vị trí có mẫu elaboarte và 'chuyển động con trỏ'. Bạn có thể làm những việc như tìm một mẫu, sau đó tìm ví dụ tiếp theo, THÌ thực hiện thao tác chèn. Hoặc bạn có thể thay đổi văn bản, thay vì chỉ thực hiện chèn. Hoặc bạn có thể thay đổi giữa các phạm vi. Đừng quên rằng "ex" cho phép bạn sử dụng "." là dòng hiện tại, vì vậy, / ^ somepatter / s / blah / foo / sẽ hoạt động.


0

Bạn có thể sử dụng mã dòng đơn sau đây để chèn một dòng hoặc nhiều dòng vào một vị trí nhất định trong một tệp, trong trường hợp của bạn trước 'Virtualhost'. Mã về cơ bản tìm kiếm tên tệp (có thể là *. *, Nếu bạn muốn chèn các văn bản trong tất cả các tệp) trong thư mục đã cho và các thư mục con của nó. Trong các tệp được tìm thấy, nó tìm kiếm mẫu 'Virtualhost'. Sau khi tìm thấy mẫu, nó thay thế nó bằng dòng đầu tiên \ nsecondline \ notherlines \ n \ Virtualhost. Lưu ý rằng 'Virtualhost' là một phần của văn bản để thay thế, nếu không chúng tôi sẽ mất nó.

find directory/ -name filename -print | xargs sed -i 's|VirtualHost|firstline\nsecondline\notherlines\nVirtualHost|g'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.