Jest to głównie nie na temat, ale możesz użyć
find -maxdepth 1 -type f -name '*.txt' | xargs python -c '
import fileinput
for line in fileinput.input(inplace=True):
print line.replace("blah", "blee"),
'
Główną korzyścią (ponad ... xargs ... -I {} ... sed ...
) tutaj jest szybkość: unikasz wywoływania sed
10 milionów razy. Byłoby jeszcze szybciej, gdybyś mógł uniknąć używania Pythona (ponieważ Python jest stosunkowo powolny), więc perl może być lepszym wyborem dla tego zadania. Nie jestem pewien, jak zrobić odpowiednik w perlu.
Działa to w ten sposób, że xargs
wywołuje Python z tyloma argumentami, ile może zmieścić się w jednym wierszu poleceń i kontynuuje działanie, dopóki nie zabraknie argumentów (które są dostarczane przez ls -f *.txt
). Liczba argumentów dla każdego wywołania będzie zależeć od długości nazw plików i, hmm, innych rzeczy. fileinput.input
Funkcja daje kolejne linie z plików nazwanych w każdym wywołaniu argumentów za, a inplace
opcja mówi, że w magiczny sposób „złapać” wyjście i używać go zastąpić każdą linię.
Zauważ, że ciąg Pythona replace
metoda nie używa wyrażeń regularnych; jeśli ich potrzebujesz, musisz import re
i użyj print re.sub(line, "blah", "blee")
. Są to RegExps kompatybilne z Perl, które są swego rodzaju mocno ufortyfikowanymi wersjami tych, które otrzymujesz sed -r
.
edytować
Jak wspomina akira w komentarzach, oryginalna wersja używa glob ( ls -f *.txt
) zamiastfind
polecenia nie działałaby, ponieważ globs są przetwarzane przez bash
samą powłokę ( ). Oznacza to, że zanim polecenie zostanie uruchomione, w wierszu polecenia zostanie wstawionych 10 milionów nazw plików. Jest prawie pewne, że przekracza maksymalny rozmiar listy argumentów polecenia. Możesz użyć xargs --show-limits
do tego informacji specyficznych dla systemu.
Uwzględniany jest również maksymalny rozmiar listy argumentów xargs
, co ogranicza liczbę argumentów przekazywanych do każdego wywołania Pythona zgodnie z tym limitem. Ponieważ xargs
nadal będziesz musiał wywoływać Pythona kilka razy, sugestia Akiry, aby użyć os.path.walk
listy plików, prawdopodobnie zaoszczędzi ci trochę czasu.
sed
dla każdego pliku. Nie jestem pewien, czy istnieje sposób na otwarcie, edycję, zapisanie i zamknięcie serii plikówsed
; jeśli prędkość jest niezbędna, możesz użyć innego programu, na przykład Perla lub Pythona.