Chciałbym uruchomić wyszukiwanie i zastąpić w pliku HTML za pomocą wiersza polecenia.
Moje polecenie wygląda mniej więcej tak:
sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html > index.html
Kiedy uruchamiam to i potem patrzę na plik, jest on pusty. Usunął zawartość mojego pliku.
Kiedy uruchomię to po przywróceniu pliku:
sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html
Jest stdout
to zawartość pliku, a wyszukiwanie i zamiana zostały wykonane.
Dlaczego to się dzieje?
shell
unix
sed
io-redirection
BBales
źródło
źródło
perl -pi -w -e 's/STRING_TO_REPLACE/REPLACE_WITH/g;' index.html
sed
polecenie, aby znaleźć ciąg i zastąpić całą linię: stackoverflow.com/questions/11245144/…Odpowiedzi:
Gdy powłoka widzi
> index.html
w wierszu poleceń, otwiera plikindex.html
do zapisu , usuwając całą swoją poprzednią zawartość.Aby to naprawić, musisz przekazać
-i
opcję, abysed
wprowadzić zmiany bezpośrednio i utworzyć kopię zapasową oryginalnego pliku, zanim dokona on zmian w miejscu:Bez .bak polecenie nie powiedzie się na niektórych platformach, takich jak Mac OSX.
źródło
truncates the file
zamiastopens the file
prawdopodobnie czyni to jaśniejszym.sed -i '' 's/blah/xx/g'
.bak
posed -i
?Alternatywnym, użytecznym wzorem jest:
Ma to ten sam efekt, bez użycia
-i
opcji, a dodatkowo oznacza, że jeśli skrypt sed z jakiegoś powodu zawiedzie, plik wejściowy nie zostanie zablokowany. Ponadto, jeśli edycja się powiedzie, nie będzie leżącego pliku kopii zapasowej. Ten rodzaj idiomu może być przydatny w Makefiles.Wiele seds ma taką
-i
opcję, ale nie wszystkie; posix sed to taki, który tego nie robi. Jeśli więc zależy Ci na przenośności, najlepiej tego unikać.źródło
... && mv index.html{.tmp,}
sh
(jeśli dobrze pamiętam) nie ma tego{...}
rozszerzenia. W Makefile możeszsh
raczej używać niżbash
, więc jeśli dążysz do przenośności (lub posixness), musisz unikać takiej konstrukcji.Dokonuje to globalnego podstawienia lokalnego w pliku index.html. Cytując ciąg zapobiega problemom z białymi znakami w zapytaniu i zamianie.
źródło
użyj opcji -i, np
źródło
's/STRING_TO_REPLACE/REPLACE_WITH/g'
-i
wykonuje edycję plików na miejscu , więc nie ma sensu łączyć ich z wejściem standardowym .Aby zmienić wiele plików (i zapisać kopię zapasową każdego pliku jako * .bak):
weźmie wszystkie pliki w katalogu i wymienić
|
zx
tego nazywany jest „Perl pie” (łatwe, jak ciasto)źródło
sed
jako wymaganie, wykorzystał go tylko jako narzędzie, które już wypróbowano.Powinieneś spróbować użyć opcji
-i
edycji w miejscu.źródło
Jeśli masz link do dodania, spróbuj tego. Wyszukaj adres URL jak powyżej (zaczynając od https i kończąc na.com tutaj) i zastąp go ciągiem URL. Użyłem
$pub_url
tutaj zmiennej .s
tutaj oznacza wyszukiwanie ig
oznacza globalną wymianę.To działa !
źródło
Ostrzeżenie: to niebezpieczna metoda! Nadużywa buforów we / wy w systemie Linux i dzięki konkretnym opcjom buforowania zarządza pracą na małych plikach. To ciekawa ciekawość. Ale nie używaj go do prawdziwej sytuacji!
Poza
-i
opcjąsed
można użyćtee
narzędzia .Od
man
:Tak więc rozwiązaniem byłoby:
- tutaj
tee
powtarza się, aby upewnić się, że rurociąg jest buforowany. Następnie wszystkie polecenia w potoku są blokowane, dopóki nie uzyskają danych wejściowych do pracy. Każde polecenie w potoku rozpoczyna się, gdy poprzedzające polecenia zapisują 1 bufor bajtów ( gdzieś rozmiar jest zdefiniowany ) na wejściu polecenia. Tak więc ostatnie polecenietee index.html
, które otwiera plik do zapisu i dlatego go opróżnia, jest uruchamiane po zakończeniu potoku wyjściowego i wyjściu znajduje się w buforze w potoku.Najprawdopodobniej następujące elementy nie będą działać:
- uruchomi oba polecenia potoku w tym samym czasie, bez blokowania. (Bez blokowania gazociąg powinien przechodzić linię bajty po linii zamiast buforu przez bufor. Tak samo jak podczas uruchamiania
cat | sed s/bar/GGG/
. Bez blokowania jest bardziej interaktywny i zazwyczaj rurociągi zaledwie 2 poleceń uruchomić bez buforowania i blokowania. Dłuższe rurociągi są buforowane.) Thetee index.html
woli otwórz plik do zapisu i zostanie on opróżniony. Jeśli jednak zawsze włączasz buforowanie, druga wersja również będzie działać.źródło
>
, ale chodzi o to, że jest to zepsute rozwiązanie, które może spowodować utratę danych).Problem z poleceniem
jest to, że
file
jest obcinane przez powłokę, zanim sed faktycznie ją przetworzy. W rezultacie otrzymujesz pusty plik.Sed to sposób na
-i
edycję w miejscu, jak sugerowały inne odpowiedzi. Nie zawsze jest to jednak to, czego chcesz.-i
utworzy plik tymczasowy, który zostanie następnie użyty do zastąpienia oryginalnego pliku. Jest to problematyczne, jeśli oryginalny plik był linkiem (link zostanie zastąpiony zwykłym plikiem). Jeśli chcesz zachować łącza, możesz użyć zmiennej tymczasowej do przechowywania danych wyjściowych sed przed zapisaniem ich z powrotem do pliku, w następujący sposób:Jeszcze lepiej, użycie
printf
zamiastecho
ponieważecho
jest prawdopodobne, aby proces\\
jak\
w niektórych muszli (np kreska):źródło
sed 'code' file > file.tmp; cat file.tmp > file; rm file.tmp
I
ed
odpowiedź:Aby powtórzyć odpowiedź na kodaddict , powłoka najpierw obsługuje przekierowanie , usuwając plik „input.html”, a następnie powłoka wywołuje polecenie „sed”, przekazując mu teraz pusty plik.
źródło
ed
wersji”sed
odpowiedzi? czy działa szybciej?sed
s nie implementują-i
do edycji w miejscu.ed
jest wszechobecny i pozwala zapisywać zmiany w oryginalnym pliku. Ponadto zawsze dobrze jest mieć wiele narzędzi w zestawie.Możesz używać Vima w trybie Ex:
%
wybierz wszystkie liniex
Zapisz i zamknijźródło
Szukałem opcji, w której mogę zdefiniować zakres linii i znalazłem odpowiedź. Na przykład chcę zmienić host1 na host2 z linii 36-57.
Możesz również użyć opcji gi, aby zignorować wielkość liter.
źródło
Z całym szacunkiem dla powyższych poprawnych odpowiedzi, zawsze dobrym pomysłem jest uruchamianie takich skryptów „na sucho”, aby nie uszkodzić pliku i zacząć od nowa.
Wystarczy, że skrypt rozleje dane wyjściowe do wiersza poleceń zamiast zapisywać je w pliku, na przykład w ten sposób:
LUB
W ten sposób możesz zobaczyć i sprawdzić dane wyjściowe polecenia bez obcinania pliku.
źródło