Хорошо, я запутался и у меня закончились идеи.
Я пытаюсь заменить все старые IP-адреса на новые.
find -type f | grep \.php$ | xargs sed -r -i "s/(\'|\")(localhost|127.0.0.1|10.0.32.4|10.0.32.5)(\'|\")/\"10.0.32.165\"/g"
Я пытаюсь найти все файлы PHP и заменить любой из следующих (localhost, 127.0.0.1, 10.0.32.4, 10.0.32.5) на 10.0.32.165.
find * | grep \.php$ | xargs egrep "(\'|\")(localhost|127.0.0.1|10.0.32.4|10.0.32.5)(\'|\")"
После запуска первой команды я хочу убедиться, что не осталось следов старых значений, поэтому я запускаю указанную выше команду, но, к сожалению, она возвращает
siteeval/application/libraries/fetcher.url.class.php: $this->host = "10.0.32.4";
Кто-нибудь видит, что я делаю неправильно? или, может быть, подскажете, как это лучше сделать?
Попробуй это:
sed -e 's/\(127\.0\.0\.1\|10\.0\.32\.4\|localhost\|10\.0\.32\.5\)/10.0.32.165/g'
Вам нужно избежать скобок и трубок. Если вы хотите, чтобы они всегда находились между кавычками, попробуйте:
sed -e 's/\"\(127\.0\.0\.1\|10\.0\.32\.4\|localhost\|10\.0\.32\.5\)\"/10.0.32.165/g'
Немного тестируем:
$ echo '"10.0.32.4"' | sed -e 's/\"\(127\.0\.0\.1\|10\.0\.32\.4\|localhost\|10\.0\.32\.5\)\"/10.0.32.165/g'
10.0.32.165
$ echo '"localhost"' | sed -e 's/\"\(127\.0\.0\.1\|10\.0\.32\.4\|localhost\|10\.0\.32\.5\)\"/10.0.32.165/g'
10.0.32.165
Предложение на будущее. Всегда сначала пробуйте с небольшими выборками (используя эхо, подобное этому), прежде чем переходить к сложному случаю.
* Изменить: тоже избежали точек.
1) Вы должны избегать точек, точка соответствует любому символу. Итак, чтобы он соответствовал буквальной точке, вам нужно избежать его, поставив перед ним обратную косую черту:
\.
Это будет просто работать, потому что период метасимвола все еще соответствует точке.
2) Вам действительно нужно сопоставлять только IP в кавычках? Если не то, что вам не нужно беспокоиться о том, чтобы сопоставить их и вернуть обратно, это только усугубит ситуацию.
3) По какой-либо причине вы не можете упростить это, выполняя команду несколько раз для каждого IP-адреса?
4) Сопоставление IP-адреса с регулярным выражением приводит к безумию и, возможно, судорогам, подумайте о чем-то вроде Perl Net :: IP :: Match :: Regexp :-)
5) Вы уверены, что в этом файле нет символов возврата каретки, которые сбивают с толку sed? попробуйте cat -vE file и найдите ^ M
6) Избавьтесь от grep и просто передайте -name '* .php', чтобы найти вместо этого
Я думаю, что единственная проблема, которая у вас есть, заключается в том, что вам нужно избегать одинарных кавычек. Хотя мне это нравится немного больше:
find -type f -name '*.php' | xargs sed -r -i "s/\('|\"\)\(localhost|127.0.0.1|10.0.32.4|10.0.32.5\)\('|\"\)/${1}10.0.32.165${3}/g"
В дополнение к устранению экранирования одинарных кавычек я сохраняю совпадающий символ кавычки, чтобы его можно было восстановить по новому IP. Вот grep:
find . -type f -name '*.php' | xargs egrep "('|\")(localhost|127.0.0.1|10.0.32.4|10.0.32.165)('|\")"