Mam skrypt bash, który wylicza każdy plik * .php w katalogu i stosuje się iconv
do niego. Otrzymuje to dane wyjściowe w STDOUT.
Ponieważ dodawanie -o
parametru (z mojego doświadczenia) faktycznie zapisuje pusty plik prawdopodobnie przed konwersją, w jaki sposób mogę dostosować skrypt, aby wykonał konwersję, a następnie nadpisał plik wejściowy?
for file in *.php
do
iconv -f cp1251 -t utf8 "$file"
done
shell
text-processing
io-redirection
meder omuraliev
źródło
źródło
Odpowiedzi:
To nie działa, ponieważ
iconv
najpierw tworzy plik wyjściowy (ponieważ plik już istnieje, obcina go), a następnie zaczyna czytać plik wejściowy (który jest teraz pusty). Większość programów zachowuje się w ten sposób.Utwórz nowy plik tymczasowy dla wyniku, a następnie przenieś go na miejsce.
Jeśli
iconv
nie ma twojej platformy-o
, możesz użyć przekierowania powłoki do tego samego efektu.sponge
Narzędzie Colina Watsona (zawarte w moreutils Joeya Hessa ) automatyzuje to:Ta odpowiedź dotyczy nie tylko
iconv
dowolnego programu filtrującego. Warto wspomnieć o kilku szczególnych przypadkach:-p
mają-i
opcję zamiany plików na miejscu.grep
,tr
,sed 's/long input text/shorter text/'
), i jak życia niebezpiecznie, może chcesz prawdziwie zmodyfikować plik na swoim miejscu (inne rozwiązania wymienione tutaj utworzyć nowy plik wyjściowy i przenieś go na miejsce, aby oryginalne dane pozostały niezmienione, jeśli polecenie zostanie przerwane z jakiegokolwiek powodu).źródło
sponge
należy przypisać wyłącznie Joeyowi Hessowi; to pakiet,moreutils
który zawierasponge
, ale utrzymuje, ale jeśli chodzi o pochodzeniesponge
, podążając za linkami ze strony głównejmoreutils
, znalazłem go pierwotnie opublikowany i zasugerował włączenie Colina Watsona: „Joey pisze o braku nowych narzędzi, które pasuje do filozofii Uniksa. Moim ulubionym z takich rzeczy, które napisałem, jestsponge
„(pon., 06 lutego 2006).iconv -f cp1251 -t utf8 "$file" > "$file.new"
sort
, są dość sprytne co do-o
parametru, a jeśli wykryją, że plik wyjściowy jest taki sam jak dane wejściowe, wewnętrznie zarządzają plikiem tymczasowym, więc po prostu działa.Alternatywą jest
recode
użycie biblioteki libiconv do niektórych konwersji. Jego zachowanie polega na zamianie pliku wejściowego na dane wyjściowe, więc to zadziała:Ponieważ
recode
jako parametr przyjmuje wiele plików wejściowych, możesz oszczędzićfor
pętlę:źródło
info recode
zamiast tego. Jest bardziej gadatliwy.Na razie
działa jak marzenie
źródło
Możesz używać Vima w trybie Ex:
%
wybierz wszystkie linie!
Uruchom poleceniex
Zapisz i zamknijźródło
Oto prosty przykład . Powinien dać ci wystarczającą ilość informacji, aby zacząć.
źródło
pracuje dla mnie
źródło
Możesz użyć find, przynajmniej to działało dla mnie w Raspbian Stretch:
źródło
Jedną z opcji jest użycie
perl
interfejsuiconv
i jego-i
trybu do edycji w miejscu:Z GNU
awk
możesz także zrobić coś takiego:ksh93
Powłoka posiada również>;
operatora dla tego, który przechowuje dane wyjściowe w pliku temp która jest zmieniana na przekierowanego pliku jeśli polecenie powiodło się:źródło