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 sed10 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 xargswywoł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.inputFunkcja daje kolejne linie z plików nazwanych w każdym wywołaniu argumentów za, a inplaceopcja 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 rei 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 bashsamą 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-limitsdo 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ż xargsnadal będziesz musiał wywoływać Pythona kilka razy, sugestia Akiry, aby użyć os.path.walklisty plików, prawdopodobnie zaoszczędzi ci trochę czasu.
seddla 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.