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 -i
jest do edycji w miejscu.)
Bardziej przenośna wersja:
ed file <<!
1s/^/<?php /
wq
!
sed
i pozwala na dodanie sufiksu kopii zapasowej.
-i
nie 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 -0777
siły plików slurping tryb, więc cały plik jest odczytywany jako jednej linii. -p
umożliwia zapętlenie. -i
umoż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.bak
zamiast -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.
-i
flagi 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 -p
flagi) może zepsuć cały dzień.
sed
służy do edycji strumieni - plik nie jest strumieniem. Użyj programu przeznaczonego do tego celu, takiego jak ed
lub ex
. -i
Możliwość sed
nie 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
ed
do 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 find
liner :)
$FNAME
powinno 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