Jak mogę wstawić znacznik na początku kilku plików?


Odpowiedzi:


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

(To -ijest do edycji w miejscu.)

Bardziej przenośna wersja:

ed file <<!
1s/^/<?php /
wq
!

fajne - to trochę łatwiejsze niż to, co chciałem opisać :)
warren

Muszę tutaj dodać rozszerzenie do argumentu -i. Czy używasz sed lub GNU sed?

Richard: Ten, którego używam, twierdzi, że jest GNU sedi pozwala na dodanie sufiksu kopii zapasowej.
user1686,

2
Używam BSD sed i pozwala na edycję w miejscu, ale muszę nadać temu rozszerzenie. tzn. plik „sed -i .bak„ WZÓR ””

3
-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.
Chris Down,

5

Możesz użyć takiego AWKfiltra,

awk '{if (NR == 1) printf "% s% s", "PREFIKS", 0 $; w przeciwnym razie wydrukuj $ 0} 'plik testowy> nowy plik

Gdzie PREFIXjest twój ciąg prefiksu php.


5

Nie mogę jeszcze zostawić komentarza, ale zrobić to wszystko w jednym kroku:

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

Uwielbiam to, zaoszczędziłem godziny.
Steve Hill,

5

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.


1
„Wartość 0777 spowoduje, że Perl w całości zleje pliki, ponieważ nie ma bajtu prawnego o tej wartości” patrz sial.org/howto/perl/one-liner/#s3.5
Chris W. Rea

1
Jeśli zalecamy użycie -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ń.
Telemachus

@Telemachus - Uzgodniony. Zaktualizowano

4

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

To, co przedstawiłeś, to podstawowy sposób edycji pojedynczego pliku. Nie wydaje się to odpowiadać na problem - pytanie dotyczy modyfikacji kilku plików (choć na pierwszy rzut oka może to nie być oczywiste). Jeśli wiesz, jak wykorzystać eddo tego celu, pokaż to w swojej odpowiedzi.
rozcietrzewiacz

@rozcietrzewiacz - Ponieważ grawity zademonstrowało tę samą metodę edycji pojedynczego pliku (który został zaakceptowany), pomyślałem, że jest odpowiedni do odpowiedzi. Tak czy inaczej, umieszczam go w pętli for, co powinno złagodzić twoje obawy.
Chris Down,

0

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.
Chris Down,

@Chris Down - konwencja, którą widziałem przez całą moją karierę, różniła się w zależności od ustawienia: małe litery, wielkie litery i wielbłąd :)
warren

Camelcase i małe litery są w porządku. Tak czy inaczej, zmienne, które nie są zmiennymi środowiskowymi, nie powinny być pisane wielkimi literami.
Chris Down,

0

Jest prosty sposób

echo "startstr$(cat filename)endstring" > filename.new

Spowoduje to zerwanie z końcowymi znakami nowej linii.
Chris Down

@ChrisDown końcowe znaki nowej linii w pliku?
Hogan
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.