Bagaimana saya bisa menambahkan tag ke awal beberapa file?

18

Saya perlu menambahkan tag PHP yang mengelilingi file. Sangat mudah untuk menambahkannya menggunakan mereka

find . -exec echo "?>" >> '{}' \;

tetapi bagaimana saya bisa menambahkan tag <?php?

Gilles 'SANGAT berhenti menjadi jahat'
sumber

Jawaban:

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

(Ini -iuntuk edit di tempat.)

Versi lebih portabel:

ed file <<!
1s/^/<?php /
wq
!
grawity
sumber
bagus - yang sedikit lebih mudah dari apa yang saya tentang untuk menggambarkan :)
warren
Saya perlu menambahkan ekstensi ke argumen -i di sini. Apakah Anda menggunakan sed atau GNU sed?
Richard: Yang saya gunakan mengklaim sebagai GNU sed, dan memungkinkan menambahkan suffix cadangan.
grawity
2
Saya menggunakan BSD sed, dan memungkinkan pengeditan di tempat, tapi saya perlu memberikan ekstensi. yaitu 'sed -i .bak "POLA" file'
3
-itidak portabel, sintaks berbeda antara implementasi, dan merusak symlink. Anda akan lebih baik menggunakan aplikasi yang sebenarnya dirancang untuk mengedit file.
Chris Down
5

Anda bisa menggunakan AWKfilter seperti ini,

awk '{if (NR == 1) printf "% s% s", "PREFIX", $ 0; lain cetak $ 0} 'testfile> newfile

Di mana PREFIXstring awalan php Anda.

nik
sumber
5

Saya belum dapat meninggalkan komentar, tetapi untuk melakukan semuanya dalam satu langkah:

find . -type f -exec sed -i -e "1s/^/<?php /" -e "\$s/\$/ ?>/" {} \;

sumber
Menyukainya, menyelamatkan saya berjam-jam.
Steve Hill
5

Anda dapat melakukannya dengan perl one-liner:

perl -0777 -p -i -e "s/^/hey /g" testfile

The -0777pasukan file menyeruput modus, sehingga seluruh file dibaca sebagai satu baris. -pmemungkinkan perulangan. -imemungkinkan pengeditan di tempat file. ^menunjukkan awal suatu garis.

$ cp testfile1 testfile; perl -0777 -p -i -e "s/^/hey /g" testfile; diff testfile testfile1
1c1
< hey asdf
---
> asdf

Pembaruan: Seperti yang ditunjukkan dalam komentar, Anda dapat memilih untuk membuat cadangan secara otomatis dengan menggunakan -i.bakalih-alih -i. Ini memberikan keamanan tambahan jika terjadi kesalahan pada perintah Anda. Argumen untuk -i menjadi akhiran cadangan.

Saat memperbarui banyak file, Anda dapat menjalankan perintah dengan -i.backup${RANDOM}, periksa apakah semua file diperbarui dengan benar, lalu hapus semua file dengan ekstensi itu.

Nagul
sumber
1
"Nilai 0777 akan menyebabkan Perl menyeruput seluruh file karena tidak ada byte legal dengan nilai itu" lihat sial.org/howto/perl/one-liner/#s3.5
Chris W. Rea
1
Jika Anda merekomendasikan penggunaan -ibendera tanpa akhiran, harap peringatkan pembaca bahwa ini berarti Anda tidak memiliki cadangan . Untuk beberapa karakter lebih banyak ( -i.bak), Anda mendapatkan cadangan jika one-liner Anda termasuk salah ketik. Salah ketik yang cukup sederhana (misalnya, lupa -pbendera) dapat merusak sepanjang hari Anda sebaliknya.
Telemachus
@Telemachus - Setuju. Diperbarui.
4

seduntuk mengedit aliran - file bukan aliran. Gunakan program yang dimaksudkan untuk tujuan ini, seperti edatau ex. The -ipilihan untuk sedtidak hanya tidak portabel, itu juga akan merusak setiap symlink Anda mungkin mengalami, karena pada dasarnya menghapus dan recreates itu, yang sia-sia.

for file in foo bar baz; do
    ed -s "${file}" << EOF
0a
<?php 
.
w
EOF
done
Chris Down
sumber
Apa yang Anda sajikan adalah cara dasar untuk mengedit satu file. Ini tampaknya tidak menjawab masalah - pertanyaannya adalah tentang memodifikasi sejumlah file (meskipun mungkin tidak jelas pada pandangan pertama). Jika Anda tahu cara menggunakan eduntuk tujuan itu, tunjukkan ini dalam jawaban Anda.
rozcietrzewiacz
@rozcietrzewiacz - Karena grawity menunjukkan metode yang sama dalam mengedit satu file (yang diterima), saya pikir itu sesuai dengan jawabannya. Either way, saya memasukkannya dalam for loop, yang seharusnya meredakan kekhawatiran Anda.
Chris Down
0

Alternatif dari apa yang Anda tulis untuk menambahkan sesuatu ke akhir setiap file di direktori (dalam bash):

for FNAME in *
do
    echo "?>" >> $FNAME
done

meskipun saya suka findone-liner Anda :)

warren
sumber
$FNAMEharus $fname- berdasarkan konvensi, kami mengkapitalisasi variabel lingkungan (PAGER, EDITOR, SHELL, ...) dan variabel shell internal (BASH_VERSION, RANDOM, ...). Semua nama variabel lainnya harus mengandung setidaknya satu huruf kecil. Konvensi ini menghindari variabel lingkungan dan internal yang secara tidak sengaja diabaikan.
Chris Down
@ Chris Down - konvensi yang saya lihat sepanjang karier saya bervariasi dengan pengaturan: huruf kecil, huruf besar, dan unta :)
warren
Camelcase dan huruf kecil baik-baik saja. Either way, variabel yang bukan variabel lingkungan tidak boleh dalam huruf besar penuh.
Chris Down
0

Ada cara sederhana

echo "startstr$(cat filename)endstring" > filename.new
Hogan
sumber
Ini akan terputus dengan mengikuti baris baru.
Chris Down
@ChrisDown mengekor baris baru dalam file?
Hogan