Używam, egrep -R
po którym następuje wyrażenie regularne zawierające około 10 unii, na przykład:
.jpg | .png | .gif
itd. To działa dobrze, teraz chciałbym zamienić wszystkie znalezione ciągi na.bmp
Myślałem o czymś takim
egrep -lR "\.jpg|\.png|\.gif" . | sed "s/some_expression/.jpg/" file_it_came_form
więc problem polega na tym, jak zrobić podobne wyrażenie regularne unii w programie sed
i jak powiedzieć mu, aby zapisał zmiany w pliku, z którego pobrał dane wejściowe.
Odpowiedzi:
Użyj tego polecenia:
egrep
: znajdź pasujące wiersze przy użyciu rozszerzonych wyrażeń regularnych-l
: wyświetla tylko pasujące nazwy plików-R
: przeszukuje rekurencyjnie wszystkie podane katalogi-Z
: użyj\0
jako separatora rekordów"\.jpg|\.png|\.gif"
: Pasuje do jednego z ciągów".jpg"
,".gif"
lub".png"
.
: rozpoczęcie wyszukiwania w bieżącym kataloguxargs
: wykonuje polecenie ze stdin jako argumentem-0
: użyj\0
jako separatora rekordów. Jest to ważne, aby dopasować-Z
ofegrep
i uniknąć oszukania przez spacje i znaki nowej linii w nazwach plików wejściowych.-l
: użyj jednej linii na polecenie jako parametrused
: The s TREAM wyd itor-i
: zamień plik wejściowy na wyjście bez tworzenia kopii zapasowej-e
: użyj następującego argumentu jako wyrażenia's/\.jpg\|\.gif\|\.png/.bmp/g'
Zamienić wszystkie wystąpienia ciągów".jpg"
,".gif"
lub".png"
z".bmp"
źródło
sed -r
rozszerzonych wyrażeń regularnych. W tym momencie wzorzec będzie pasował do tego, co jest używane w egrep i możesz chcieć umieścić go w zmiennej do ponownego wykorzystania.Szczerze mówiąc, tak jak uwielbiam seda za odpowiednie zadania, jest to zdecydowanie zadanie dla perla - jest to naprawdę potężniejsze dla tego rodzaju linijków, zwłaszcza, aby "zapisać to skąd pochodzi" (
-i
przełącznik Perla robi to dla you, a opcjonalnie pozwala również zachować starą wersję, np. z dołączonym .bak, po prostu użyj-i.bak
zamiast tego).zamiast skomplikowanej pracy w sedzie (jeśli tam nawet jest to możliwe) lub awk ...
źródło
sed
... Myślę, że albo zapomniałem niektórych flag do seda lub miał ograniczenia.Inny sposób, aby to zrobić
Trochę pomocy odnośnie powyższego polecenia
Znalezisko wykona za Ciebie wyszukiwanie w bieżącym katalogu wskazanym przez
.
-name
nazwa pliku w moim przypadku pom.xml może zawierać symbole wieloznaczne.-exec
wykonaćsed
edytor strumieni-i
ignoruj wielkość liters
jest zamiennikiem/4.6.0.../
Ciąg do przeszukania/5.0.0.../
Sznurek do wymianyźródło
Nie mogłem sprawić, aby żadne z poleceń na tej stronie działało dla mnie: rozwiązanie sed dodało nową linię na końcu wszystkich przetwarzanych plików, a rozwiązanie Perl nie mogło zaakceptować wystarczającej liczby argumentów z find. Znalazłem takie rozwiązanie, które działa idealnie:
To rekursja dół bieżącej drzewo katalogów i wymienić
search_regex
zreplacement_string
na wszystkie pliki kończące się.h
lub.m
.W przeszłości do tego celu używałem również rpl .
źródło
spróbuj czegoś za pomocą pętli for
nie ładne, ale powinno.
źródło
|while read i
wzorca umożliwiłoby przesyłanie strumieniowe i uniknęło ograniczeń długości, gdy wyniki egrep stałyby się zbyt długieMój przypadek użycia polegał na tym, że chciałem zamienić
foo:/Drive_Letter
go nafoo:/bar/baz/xyz
W moim przypadku udało mi się to zrobić za pomocą następującego kodu. Znajdowałem się w tym samym katalogu, w którym znajdowała się większość plików.mam nadzieję, że pomogło.
AKTUALIZACJA s | foo: / litera_dysku: | foo: / ba / baz / xyz | g
źródło
sed 's|foo:/Drive_letter:|foo:/ba/baz/xyz|g'