Назад | Перейти на главную страницу

SED Найти и заменить с помощью \ регулярных выражений

Хорошо, я запутался и у меня закончились идеи.

Я пытаюсь заменить все старые 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)('|\")"