
В папке моей системы есть 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
.