Заменить все вхождения термина в файлах, содержащихся в папке.

Заменить все вхождения термина в файлах, содержащихся в папке.

В папке моей системы есть C++проект, который я пытаюсь скомпилировать.

Этот процесс использует некоторые C++идиомы, которые не поддерживаются моей версией компилятора. В частности, часто внутри кода используется значение data 'nullptr'.

Я хочу заменить все вхождения nullptrна NULL.

Я могу сделать это VIMс помощью команды:

:%s/nullptr/NULL/g 

Как сделать это для всех файлов в каталоге один раз, не открывая каждый файл и не выполняя команду?

решение1

for file in /path/to/dir/*; do
  sed -i s/nullptr/NULL/g "$file"
done

Однако это не влияет на подкаталоги.

Редактировать 1

Более быстрое решение (с GNU):

find /path/to/dir -type f -print0 | xargs -0 sed -i s/nullptr/NULL/g

Это также повлияет на подкаталоги (и dotfiles). Добавьте, -maxdepth 1если это нежелательно.

решение2

Это можно сделать двумя способами:

вим

Вы можете использовать vim из командной строки следующим образом:

$ vim -c "%s/nullptr/NULL/g|wq" foo.txt

Оберните в цикл for:

$ for i in *; do vim -c "%s/nullptr/NULL/g|wq" -- "$i"; done

Перл

$ perl -p -i -e 's/nullptr/NULL/g' foo.txt

Оберните в цикл for:

$ for i in *; do perl -p -i -e 's/nullptr/NULL/g' -- "$i"; done

Или просто:

$ perl -p -i -e 's/nullptr/NULL/g' -- *

решение3

С помощью инструментов GNU:

grep -rlZ nullptr /path/to/dir |
  xargs -r0 sed -i s/nullptr/NULL/g

Чтобы не пришлось переписывать каждый файл.

Как всегда с sed -i, имейте в виду, что это может нарушить ссылки (жесткие и мягкие), изменить владельца и разрешение файлов и изменить разреженность и потенциально другие необычные атрибуты файлов. Также будьте осторожны, что версии GNU grepдо 2.12следуют символическим ссылкам при спуске по дереву каталогов с -r.

Связанный контент