Làm cách nào tôi có thể thêm thẻ vào đầu một số tệp?


18

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:


18
sed -i "1s/^/<?php /" file

(Phần -inày dành cho chỉnh sửa tại chỗ.)

Phiên bản di động hơn:

ed file <<!
1s/^/<?php /
wq
!

tiện lợi - điều đó dễ hơn một chút so với những gì tôi sắp mô tả :)
warren

Tôi cần thêm phần mở rộng cho đối số -i ở đây. Bạn đang sử dụng sed hay GNU sed?

Richard: Người mà tôi đang sử dụng tuyên bố là GNU sedvà nó cho phép thêm hậu tố sao lưu.
grawity

2
Tôi đang sử dụng BSD sed và nó cho phép chỉnh sửa tại chỗ, nhưng tôi cần cung cấp cho nó một phần mở rộng. tức là 'sed -i .bak tập tin "THỰC HIỆN"

3
-ikhô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.
Chris Xuống

5

Bạn có thể sử dụng AWKbộ lọc như thế này,

awk '{if (NR == 1) printf "% s% s", "PREFIX", $ 0; khác in $ 0} 'testfile> newfile

PREFIXChuỗi tiền tố php của bạn ở đâu .


5

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/\$/ ?>/" {} \;

Yêu nó, tiết kiệm cho tôi hàng giờ.
Steve Hill

5

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 -0777lực lượng tập tin slurping chế độ, vì vậy toàn bộ tập tin được đọc như một dòng. -pcho phép lặp. -icho 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.bakthay 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 đó.


1
"Giá trị 0777 sẽ khiến Perl làm lu mờ
Chris W. Rea

1
Nếu bạn khuyên bạn nên sử dụng -icờ 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 -pcờ) có thể làm hỏng cả ngày của bạn.
Telemachus

@Telemachus - Đồng ý. Cập nhật.

4

seddà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ư edhoặc ex. Các -itùy chọn để sedkhô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

Những gì bạn trình bày là một cách cơ bản để chỉnh sửa một tập tin duy nhất. Điều này dường như không trả lời được vấn đề - câu hỏi là về việc sửa đổi một số tệp (mặc dù thoạt nhìn có thể không rõ ràng). Nếu bạn biết cách sử dụng edcho mục đích đó, hãy thể hiện điều này trong câu trả lời của bạn.
rozcietrzewiacz

@rozcietrzewiacz - Vì grawity thể hiện cùng một phương pháp chỉnh sửa một tệp duy nhất (đã được chấp nhận), tôi nghĩ rằng nó phù hợp với câu trả lời. Dù bằng cách nào, tôi đặt nó trong một vòng lặp for, điều này sẽ làm giảm bớt mối quan tâm của bạn.
Chris Xuống

0

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 findlớp lót của bạn :)


$FNAMEnê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ộ.
Chris Xuống

@Chris Down - quy ước tôi đã thấy toàn bộ sự nghiệp của mình đã thay đổi bằng cách đặt: chữ thường, chữ hoa và chữ hoa văn :)
warren

Lạc đà và chữ thường là tốt. Dù bằng cách nào, các biến không phải là biến môi trường không nên viết hoa.
Chris Xuống

0

Có cách đơn giản

echo "startstr$(cat filename)endstring" > filename.new

Điều này sẽ phá vỡ với dòng mới.
Chris Xuống

@ChrisDown trailing dòng mới trong tập tin?
Hogan
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.