Faceci GNU NAPRAWDĘ zawiedli, gdy wprowadzili rekursywne wyszukiwanie plików na grep. grep służy do wyszukiwania RE w plikach i drukowania pasującej linii (g/re/p pamiętasz?) NIE dla wyszukiwania plików. Jest bardzo dobre narzędzie o bardzo oczywistej nazwie do wyszukiwania plików. Cokolwiek stało się z mantrą UNIXa, zrobić jedną rzecz i zrobić to dobrze?
W każdym razie, oto jak chcesz robić to, co chcesz przy użyciu tradycyjnego podejścia UNIX (niesprawdzone):
find /path/to/folder -type f -print |
while IFS= read -r file
do
awk -v old="$oldstring" -v new="$newstring" '
BEGIN{ rlength = length(old) }
rstart = index($0,old) { $0 = substr($0,rstart-1) new substr($0,rstart+rlength) }
{ print }
' "$file" > tmp &&
mv tmp "$file"
done
Nie dlatego, że za pomocą awk/index() zamiast sed i grep Ci uniknąć konieczności uciec wszystkie metaznaki RE, które mogą pojawić się w starym lub nowym łańcuchu, i wymyślić znak, który będzie użyty jako ogranicznik sed, który nie może pojawić się w starych lub nowych ciągach, i że nie musisz uruchamiać grep ponieważ zastąpienie nastąpi tylko w przypadku plików, które zawierają żądany ciąg znaków. Powiedziawszy to wszystko, jeśli nie chcesz, aby znacznik czasu pliku się zmieniał, jeśli nie modyfikujesz pliku, po prostu zrób różnicę w tmp i oryginalnym pliku przed wykonaniem mv lub wrzuć fgrep -q przed awk.
Zastrzeżenie: Powyższe nie działa w przypadku nazw plików zawierających znaki nowej linii. Jeśli masz te, daj nam znać, a my pokażemy Ci, jak sobie z nimi radzić.
Nawiasy kwadratowe konieczne może być uciekł. Podwójnie cytuj wzór sed. – phs
Będziesz także mieć problem z '/' we wzorcach. Powinni być uciekani. Lub możesz użyć innego separatora dla polecenia 's' (np.' @ '). –