Inne rozwiązania łączą składni regex. Aby korzystać z Perl/wzory pcre dla zarówno wyszukiwania i zamiany, a unikać przetwarzania każdy plik, to działa całkiem dobrze:
grep -rlZP 'match1' | xargs -0r perl -pi -e 's/match2/replace/g;'
gdzie match1
i match2
są zwykle identyczne, ale match1
mogą zostać uproszczone w celu usunięcia bardziej zaawansowane funkcje, które są istotne tylko dla substytucji, np przechwytywanie grup.
Tłumaczenie: grep rekurencyjnie i wylistuj pasujące pliki, oddzielone przez nul, aby zabezpieczyć znaki specjalne w nazwie pliku, które pasują do tego wzorca PCRE, a następnie przeprowadź te nazwy plików do xargs, który oczekuje listy rozdzielonej null, ale nie będzie zrób cokolwiek, jeśli nie otrzymasz żadnych nazw, i uzyskaj perla, aby przepisał każdy plik, zastępując linie, w których znalezione są dopasowania.
Dodaj opcję I
do grep
, aby również zignorować pliki binarne.
Nie wierzę, że grep może to zrobić (mógłbym się mylić). Łatwiejszym sposobem byłoby użycie sed lub perl do zastąpienia. –
Spróbuj użyć podciągu 'sed -i '/ /. */Replace /'' –
@Eddy_Em To zastąpi całą linię przez zamianę. Musisz użyć grupowania, aby przechwycić część linii przed i po podłańcuchu, a następnie umieścić ją w linii zastępczej. 'sed -i 's/\ (. * \) substring \ (. * \)/\ 1replace \ 2 /'' – JStrahl