Intereting Posts

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

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

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

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

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

 :%s/nullptr/NULL/g 

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

Два способа сделать это:

напор

Вы можете использовать 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

 $ 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' -- * 
 for file in /path/to/dir/*; do sed -is/nullptr/NULL/g "$file" done 

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

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

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

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

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

С инструментами GNU:

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

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

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