Muszę dodać tagi PHP otaczające plik. Łatwo je dołączyć za pomocą
find . -exec echo "?>" >> '{}' \;
ale w jaki sposób można poprzedzić tag <?php?
Muszę dodać tagi PHP otaczające plik. Łatwo je dołączyć za pomocą
find . -exec echo "?>" >> '{}' \;
ale w jaki sposób można poprzedzić tag <?php?
Odpowiedzi:
sed -i "1s/^/<?php /" file
(To -ijest do edycji w miejscu.)
Bardziej przenośna wersja:
ed file <<!
1s/^/<?php /
wq
!
sedi pozwala na dodanie sufiksu kopii zapasowej.
-inie jest przenośny, składnia różni się między implementacjami i przerywa dowiązania symboliczne. Lepiej skorzystaj z aplikacji przeznaczonej do edycji plików.
Nie mogę jeszcze zostawić komentarza, ale zrobić to wszystko w jednym kroku:
find . -type f -exec sed -i -e "1s/^/<?php /" -e "\$s/\$/ ?>/" {} \;
Możesz to zrobić za pomocą linijki Perl:
perl -0777 -p -i -e "s/^/hey /g" testfile
Te -0777siły plików slurping tryb, więc cały plik jest odczytywany jako jednej linii. -pumożliwia zapętlenie. -iumożliwia edycję pliku na miejscu. ^wskazuje początek linii.
$ cp testfile1 testfile; perl -0777 -p -i -e "s/^/hey /g" testfile; diff testfile testfile1
1c1
< hey asdf
---
> asdf
Aktualizacja: jak wskazano w komentarzach, możesz wybrać automatyczne generowanie kopii zapasowej za pomocą -i.bakzamiast -i. Zapewnia to dodatkowe bezpieczeństwo w przypadku błędów w poleceniu. Argumentem -i staje się przyrostek kopii zapasowej.
Podczas aktualizacji wiązki plików możesz uruchomić polecenie za pomocą -i.backup${RANDOM}, sprawdź, czy wszystkie pliki zostały poprawnie zaktualizowane, a następnie usuń wszystkie pliki z tym rozszerzeniem.
-iflagi bez przyrostka, należy ostrzec czytelników, że oznacza to brak kopii zapasowej . Za kilka znaków więcej ( -i.bak) otrzymasz kopię zapasową na wypadek, gdyby Twoja linijka zawiera literówkę. Dość prosta literówka (na przykład zapomnienie -pflagi) może zepsuć cały dzień.
sedsłuży do edycji strumieni - plik nie jest strumieniem. Użyj programu przeznaczonego do tego celu, takiego jak edlub ex. -iMożliwość sednie tylko nie jest przenośny, będzie to również przełamać wszelkie dowiązania mogą się pojawić, ponieważ zasadniczo usuwa go i odtwarza go, co nie ma sensu.
for file in foo bar baz; do
ed -s "${file}" << EOF
0a
<?php
.
w
EOF
done
eddo tego celu, pokaż to w swojej odpowiedzi.
Alternatywa do tego, co napisałeś o dodawaniu czegoś na końcu każdego pliku w katalogu (w bash):
for FNAME in *
do
echo "?>" >> $FNAME
done
chociaż podoba mi się twój findliner :)
$FNAMEpowinno być $fname- zgodnie z konwencją, kapitalizujemy zmienne środowiskowe (PAGER, EDITOR, SHELL, ...) i wewnętrzne zmienne powłoki (BASH_VERSION, RANDOM, ...). Wszystkie pozostałe nazwy zmiennych powinny zawierać co najmniej jedną małą literę. Konwencja ta pozwala uniknąć przypadkowego zastąpienia zmiennych środowiskowych i wewnętrznych.
Jest prosty sposób
echo "startstr$(cat filename)endstring" > filename.new