Czy jest jakiś sposób na uruchomienie próbnego wyszukiwania rekurencyjnego i zastąpienie go sed
przed faktycznym uruchomieniem? Chcę tylko wydrukować wyniki przed rozpoczęciem wyszukiwania i zamiany. Coś jak echo wyników,
grep -rl term1 . |xargs sed -i -e 's/term1/term2/'
Odpowiedzi:
Możesz uruchomić
sed
bez-i
i krok po kroku z wyjściemless
Następnie uruchom za
sed
pomocą,-i.bak
aby utworzyć kopie zapasowe, które możesz później różnicowaćEdycja: Jak sugerowano w komentarzu, użyj
grep --null | xargs -0
. Powoduje to, że nazwy plików są kończone przez bajt zerowy, co czyni je bezpiecznymi dla nazw plików o nietypowych znakach, takich jak znak nowej linii. Tak,\n
jest poprawnym znakiem w nazwie pliku unix. Jedynymi zabronionymi postaciami są ukośnik/
i znak nul\0
źródło
grep -rl --null
ponieważ OP nie określił systemu operacyjnego i-Z
oznacza coś innego w BSD / OSX (dekompresja).--null
jest taki sam na GNU i BSDgrep
jest to (rozwidlenie) grep GNU na FreeBSD i NetBSD. Na NetBSD-Z
nadal oznacza--null
(według strony podręcznika), ale zgadzam się - null jest bardziej przenośny. Zauważ też, że ani --null ani -Z nie działają na OpenBSDsed -i '' -e s/.../
w BSDsed
(nie ma opcjonalnych opcji)Użyj
sed
zfind
zamiastgrep
Przede wszystkim wolałbym
find
zamiast tegogrep
, a to z trzech dobrych powodów:find
pozwala na bardziej precyzyjny wybór pliku. Na przykładgrep -r string *.txt
da pliki tylko w bieżącym katalogu; nie te w podkatalogach.find
pochodzi z potężną-exec
opcją, która eliminuje potrzebę całego--null … |xargs 0
konstruktu.-readable
i-writable
opcjefind
uniemożliwi tracić czasu na plikach, które nie mogą być udostępniane.Test przechwytywania
To powiedziawszy,
grep
nadaje się na pierwszy test, aby zobaczyć, co zostanie uchwycone:lub dokładniej:
Próba
Teraz przejdź do
sed
próbnego rozruchu.sed
Opcja-n
jest synonimem--quiet
, ap
na samym końcused
wyrazu będzie wydrukować bieżącą przestrzeń wzoru.lub dokładniej:
Wykonanie
Jeśli wszystko wygląda dobrze, wydaj ostateczne polecenie, zastępując
sed
opcję-n
przez-i
„na miejscu” i usuwającp
na końcu.lub dokładniej:
Więcej
find
przykładówWięcej
find
przykładów można znaleźć tutaj .źródło