Próbuję dodać nagłówek licencji do wszystkich plików nagłówka i plików źródłowych w katalogu projektu za pomocą pętli for. To nie działa, czy używasz innego podejścia sed
?
text-processing
shell-script
Satyendra
źródło
źródło
Odpowiedzi:
źródło
globstar
bash, aby to zadziałało.To mniej więcej rozszerzony komentarz do odpowiedzi Daniela Serodio . Zacząłem pisać jako komentarz, ale szybko stał się zbyt duży ...
Aby bash glob był rekurencyjny, wymaga tego
shopt -s globstar
. Musisz włączyć globstar, w przeciwnym razie**
nie działa. Opcja powłoki globstar została wprowadzona do wersji 4 bash.Aby uniknąć przetwarzania katalogu, takiego jak
my.cpp/
: użyj testu[[ -f $f ]]
... Gdy test jest w nawiasach kwadratowych, zmienne nie muszą być cudzysłowione.Można również rozważyć możliwość braku dopasowania pasujących plików
shopt -s nullglob
, co pozwala na rozwinięcie wzorców, które nie pasują do żadnego pliku, do łańcucha zerowego, a nie do siebie.Aby obsługiwać wiele wzorów, można łańcucha wzorców glob:
**/*.cpp **/*.h
, ale może preferrably, gdy opcja powłoki extglob jest on za pośrednictwemshopt -s extglob
, można użyć takich konstruktów, takich jak**/*.@(cpp|h)
co pozwala uniknąć wielu przechodzi nad systemem plików; raz dla każdego wzoru.Jeśli chcesz
.files
zostać uwzględniony, użyj.*.cpp
itp. Lub użyjshopt -s dotglob
Aby bezpiecznie obsłużyć modyfikowanie pliku, który jest przesyłany potokiem, użyj
sponge
z pakietumoreutils
(oszczędza to konieczności tworzenia własnego pliku tymczasowego)źródło
[[
może z wdziękiem obsłużyć wartość zerową$f
.unset x; [ -f $x ] && echo exists
**/*.@(cpp|h)
ją$( find . -name "*.h" -name "*.cpp")
Dziękuję @fred, @maxmackie, @enzotib.
Czy możesz sprawdzić procedurę, którą zastosowałem.
w przeciwnym razie nagłówek licencji zostanie skopiowany wiele razy.
Proszę zasugerować mi wzorzec, który powinien przejść przez wszystkie nagłówki i źródła w katalogu projektu i podkatalogach.
Nie mogłem w pełni zrozumieć, co sugeruje @fred.
źródło
targln=2; findln=$(sed -rne $targln'{\|// Copyright|=;q}' "$f"); if ((findln==targln));then
... ale oczywiście ponad wszystko, najpierw dokładnie go przetestuj ... PS. Oczywiście w Unix i Linuxie kurs jest taki, żeby zamieszczać takie dodatki w oryginalnym pytaniu, a nie jako odpowiedź ...grep
, dodaj-q
opcję dogrep
. Zawsze dodawaj podwójne cudzysłowy$f
.Możesz to zrobić za pomocą
ex
lubed
jeśli wolisz (nie powinieneś tego robićsed
zgodnie z życzeniem,sed
jest przeznaczony do edycji strumieni,-i
to zły pomysł z różnych powodów):źródło
sed -i
to zły pomysł?sed -i
łamie dowiązania symboliczne i dowiązania twarde, co powoduje nieoczekiwane zachowanie. W najlepszym wypadku jest to nieintuicyjne, w gorszym jest aktywnie szkodliwe.Jeśli masz
header_file
pożądaną zawartość:źródło
źródło
Blog Gerharda Gappmeiera - Howto rekurencyjnie zastępuje nagłówki plików źródłowych
Wpis na blogu załączył
tar.gz
plik zawierający potrzebne pliki.Ma
header.template
plik, w którym możesz napisać własny komentarz, może obejmować wiele wierszy.Ma
remove_header.awk
skrypt, który zastępuje istniejące nagłówki nowym nagłówkiem.Aby go uruchomić:
źródło