Tôi cần thêm các thẻ PHP xung quanh một tệp. Thật dễ dàng để nối chúng bằng cách sử dụng
find . -exec echo "?>" >> '{}' \;
nhưng làm thế nào tôi có thể thêm thẻ <?php
?
Tôi cần thêm các thẻ PHP xung quanh một tệp. Thật dễ dàng để nối chúng bằng cách sử dụng
find . -exec echo "?>" >> '{}' \;
nhưng làm thế nào tôi có thể thêm thẻ <?php
?
Câu trả lời:
sed -i "1s/^/<?php /" file
(Phần -i
này dành cho chỉnh sửa tại chỗ.)
Phiên bản di động hơn:
ed file <<!
1s/^/<?php /
wq
!
sed
và nó cho phép thêm hậu tố sao lưu.
-i
không khả dụng, cú pháp khác nhau giữa các lần triển khai và nó phá vỡ các liên kết tượng trưng. Bạn nên sử dụng một ứng dụng thực sự được thiết kế để chỉnh sửa các tập tin.
Tôi chưa thể để lại nhận xét, nhưng phải làm tất cả trong một bước:
find . -type f -exec sed -i -e "1s/^/<?php /" -e "\$s/\$/ ?>/" {} \;
Bạn có thể làm điều đó với một lớp lót perl:
perl -0777 -p -i -e "s/^/hey /g" testfile
Các -0777
lực lượng tập tin slurping chế độ, vì vậy toàn bộ tập tin được đọc như một dòng. -p
cho phép lặp. -i
cho phép chỉnh sửa tại chỗ của tập tin. ^
chỉ ra sự bắt đầu của một dòng.
$ cp testfile1 testfile; perl -0777 -p -i -e "s/^/hey /g" testfile; diff testfile testfile1
1c1
< hey asdf
---
> asdf
Cập nhật: Như đã nêu trong các nhận xét, bạn có thể chọn tự động tạo bản sao lưu bằng cách sử dụng -i.bak
thay vì -i
. Điều này cung cấp sự an toàn bổ sung trong trường hợp có lỗi trong lệnh của bạn. Đối số để -i
trở thành hậu tố của bản sao lưu.
Khi cập nhật một loạt các tệp, bạn có thể chạy lệnh với -i.backup${RANDOM}
, kiểm tra xem tất cả các tệp được cập nhật chính xác, sau đó xóa tất cả các tệp có phần mở rộng đó.
-i
cờ không có hậu tố, vui lòng cảnh báo người đọc rằng điều này có nghĩa là bạn không có bản sao lưu . Đối với một vài ký tự nữa ( -i.bak
), bạn có được bản sao lưu trong trường hợp một lớp lót của bạn bao gồm một lỗi đánh máy. Một lỗi đánh máy khá đơn giản (giả sử, quên -p
cờ) có thể làm hỏng cả ngày của bạn.
sed
dành cho chỉnh sửa luồng - tệp không phải là luồng. Sử dụng một chương trình dành cho mục đích này, như ed
hoặc ex
. Các -i
tùy chọn để sed
không chỉ không di động, nó cũng sẽ phá vỡ bất kỳ liên kết tượng trưng bạn có thể gặp phải, vì nó về cơ bản xóa nó và tái tạo lại nó, mà là vô nghĩa.
for file in foo bar baz; do
ed -s "${file}" << EOF
0a
<?php
.
w
EOF
done
ed
cho mục đích đó, hãy thể hiện điều này trong câu trả lời của bạn.
Một thay thế cho những gì bạn đã viết để thêm một cái gì đó vào cuối mỗi tệp trong thư mục (in bash
):
for FNAME in *
do
echo "?>" >> $FNAME
done
mặc dù tôi thích find
lớp lót của bạn :)
$FNAME
nên $fname
- theo quy ước, chúng tôi viết hoa các biến môi trường (PAGER, EDITOR, SHELL, ...) và các biến shell nội bộ (BASH_VERSION, RANDOM, ...). Tất cả các tên biến khác phải chứa ít nhất một chữ cái viết thường. Quy ước này tránh vô tình ghi đè các biến môi trường và nội bộ.
Có cách đơn giản
echo "startstr$(cat filename)endstring" > filename.new