Используйте 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"
Другие вопросы по тегам