Saya mencoba menambahkan header lisensi ke semua file header dan sumber file dalam direktori proyek menggunakan for for. Ini tidak berfungsi, apakah ada pendekatan lain yang digunakan sed
?
text-processing
shell-script
Satyendra
sumber
sumber
Jawaban:
sumber
globstar
bash agar ini berfungsi.Ini kurang lebih hanya komentar panjang tentang jawaban Daniel Serodio . Saya mulai menulisnya sebagai komentar, tetapi dengan cepat menjadi terlalu besar ...
Agar bash glob menjadi rekursif, itu membutuhkan
shopt -s globstar
. Anda harus mengaktifkan globstar, jika**
tidak, tidak akan berfungsi. Opsi shell globstar diperkenalkan ke versi 4 dari bash.Untuk menghindari pemrosesan direktori seperti
my.cpp/
, gunakan tes[[ -f $f ]]
... Ketika tes berada dalam tanda kurung ganda, variabel tidak perlu dikutip ganda.Anda juga dapat mempertimbangkan kemungkinan tidak ada file yang cocok dengan menggunakan
shopt -s nullglob
, yang memungkinkan pola yang tidak cocok dengan file untuk memperluas ke string nol, daripada diri mereka sendiri.Untuk menangani beberapa pola, Anda dapat rantai pola gumpal:
**/*.cpp **/*.h
, tapi mungkin Preferably, ketika shell pilihan extglob adalah pada melaluishopt -s extglob
, Anda dapat menggunakan konstruksi seperti seperti**/*.@(cpp|h)
yang menghindari melewati beberapa atas sistem file; satu kali untuk setiap pola.Jika Anda ingin
.files
dimasukkan, gunakan.*.cpp
dll, atau gunakanshopt -s dotglob
Untuk menangani pengubahan file dengan aman yang sedang disalurkan, gunakan
sponge
dari paketmoreutils
(menghemat Anda untuk membuat file temp Anda sendiri)sumber
[[
dapat menangani null dengan anggun$f
.unset x; [ -f $x ] && echo exists
laporan "ada" ... (tetap)**/*.@(cpp|h)
dengan$( find . -name "*.h" -name "*.cpp")
@Fred terima kasih, @maxmackie, @enzotib.
Tolong periksa prosedur yang saya ikuti.
jika tidak, tajuk lisensi akan disalin ke beberapa kali.
Tolong sarankan saya pola untuk pergi melalui semua header dan sumber di direktori proyek dan subdirektori.
Saya tidak bisa mengerti sepenuhnya apa yang telah disarankan @fred.
sumber
targln=2; findln=$(sed -rne $targln'{\|// Copyright|=;q}' "$f"); if ((findln==targln));then
... tapi, tentu saja, di atas dan di luar semua yang lain, ujilah secara menyeluruh terlebih dahulu ... PS. Merupakan hal yang wajar untuk kursus di Unix & Linux untuk mengirim tambahan seperti itu dalam pertanyaan awal Anda, bukan sebagai jawaban ...grep
, tambahkan-q
opsi kegrep
. Selalu tambahkan tanda kutip ganda di sekitar$f
.Anda dapat melakukan ini dengan
ex
ataued
jika Anda lebih suka (Anda tidak boleh melakukan ini dengansed
seperti yang Anda minta,sed
dirancang untuk mengedit stream,-i
adalah ide yang buruk karena berbagai alasan):sumber
sed -i
ide yang buruk?sed -i
memecah symlink dan hardlink, menghasilkan perilaku yang tidak terduga. Paling-paling itu tidak intuitif, paling buruk itu berbahaya secara aktif.Jika Anda memiliki
header_file
dengan konten yang diinginkan:sumber
sumber
Blog Gerhard Gappmeier - Howto secara rekursif mengganti header file dari file sumber
Posting blog telah melampirkan
tar.gz
file, berisi file yang dibutuhkan.Ini memiliki
header.template
file, di mana Anda dapat menulis komentar khusus, dapat menjangkau beberapa baris.Ini memiliki
remove_header.awk
skrip yang menggantikan tajuk yang ada dengan tajuk baru.Untuk menjalankannya:
sumber