Используйте sed для замены текста, содержащего кавычки и одинарные кавычки
Я пытаюсь найти все файлы на моем сервере с именем index.php, а затем использовать xargs для запуска sed, чтобы заменить некоторый текст в этих файлах.
Строка, которую я хочу найти:
echo '<form method="get" class="search_form" action="'.$siteUrl.'">';
И после замены это должно выглядеть так:
echo '<form method="get" class="search_form" action="/">';
Поэтому мне действительно нужно только изменить '.$siteUrl.'
одному /
Однако, когда я пытаюсь запустить эту команду из приглашения SSH (что я считаю правильным):
find . -name "index.php" -print | xargs sed -i 's/\'\.\$siteUrl\.\'/"/"/g'
он просто выводит меня на экран> и не идет дальше...
Я также пытался использовать ту же команду sed для одного файла, что делает то же самое. Может кто-нибудь указать мне, где я ошибся?
1 ответ
Решение
- Вы заменяете текст на
/
который также используется в качестве разделителя замены. Побег это так:\/
- Не нужно заключать в кавычки двойные кавычки, так как они уже присутствуют в строке html.
- Используйте двойные кавычки вокруг всего выражения sed, чтобы избежать конфликта с
'
-print
действие по умолчанию дляfind
и могут быть пропущены.
Попробуй это:
find . -name "index.php" | xargs sed -i "s/'\.\$siteUrl\.'/\//g"
Или используйте другой разделитель для sed, например :
и убрать побег, прежде чем /
:
find . -name "index.php" | xargs sed -i "s:'\.\$siteUrl\.':/:g"
Ох, и всегда хорошая идея сохранить резервную копию отредактированных файлов (-i.bak
):
find . -name "index.php" | xargs sed -i.bak "s:'\.\$siteUrl\.':/:g"