Поиск и замена с помощью find и xargs не работают

Поиск и замена с помощью find и xargs не работают

Я пытаюсь найти и заменить URL, присутствующий в исходном коде файлов html/css в целевой папке и подпапках. Я пытался использовать следующую команду:

find . -type f | xargs sed -i  's/https\:*\.websitedomain\.fr\///g'

Что я упускаю?

Заранее благодарю за любой совет

решение1

Предположим, что у вас система GNU (судя по вашему использованию, sed -iэто как раз ваш случай):

eregex='https://[^/[:space:]]+\.websitedomain\.fr/'
find . -type f -exec grep -lZEe "$eregex" {} + |
  xargs -r0 sed -i -E "s|$eregex||g"

Некоторые из проблем вашего подхода:

  • главное, что *оператор регулярного выражения соответствует 0 или более предыдущим атомам, поэтому :*соответствует 0 или более :s. Здесь мы заменяем его на , [^/[:space:]]+который соответствует 1 или более ( +, расширенный оператор регулярного выражения, отсюда -Es) символов, отличных от пробела и /( .*что, вероятно, вы имели в виду, может в конечном итоге соответствовать, google.com/ and fooнапример https://google.com/ and foo.websitedomain.fr/file).
  • Формат вывода find -print(один путь к файлу на строку) несовместим с ожидаемым форматом ввода xargs(ожидает пробел или разделитель новой строки, возможно, слова в кавычках). Формат вывода find -printне является надежно постобрабатываемым, его следует использовать только для потребления человеком. Лучше использовать find ... -exec cmd {} +, и/или использовать записи с разделителями NUL с xargs -r0( -rи -0являющимися расширениями GNU).
  • sed -iзаменяет файлы измененной копией оригинала с возможной потерей метаданных, поэтому лучше избегать запуска для файлов, которые не будут изменяться, поэтому используйте или grep -lZдля получения списка (разделенного символом NUL, -Zчтобы его можно было использовать xargs -0) файлов, в которых хотя бы одна строка соответствует регулярному выражению.
  • :не является оператором регулярных выражений, поэтому его не нужно экранировать. Что \:соответствует, не указано в POSIX и не документировано в большинстве sedреализаций. Поэтому, хотя в настоящее время он может соответствовать :в вашей sedреализации, это может измениться в будущем (например, \<или \w, хотя изначально соответствовал <и wсоответственно в конечном итоге соответствовал границе слова и символу слова в более новых версиях).
  • если ваше регулярное выражение или замена в sedкоманде sсодержит /, проще использовать другой символ в качестве разделителя, чем экранировать /с помощью обратных косых черт, что делает его довольно трудным для чтения. Поэтому s|regexp|replacement|gздесь вместо s/regexp/replacement/g. Мне нравится, |так как это делает код более разборчивым. У него есть недостаток, что его нельзя использовать в ex/ vi, s/regex/replacement/хотя он |разделяет exкоманды там (это также расширенный оператор регулярных выражений).

решение2

Попробуй это:

find . -type f | xargs sed -i  's/test\.com/set\.com/g' 

Если вам необходимо провести тест на включениеhttpsто попробуйте это:

find . -type f | xargs sed -i  's/https\:\\\\test\.com/https\:\\\\set\.com/g' 

ПРИМЕЧАНИЕ*: это заменяетtest.comсset.com

Связанный контент