Я пытаюсь найти и заменить 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 или более (+
, расширенный оператор регулярного выражения, отсюда-E
s) символов, отличных от пробела и/
(.*
что, вероятно, вы имели в виду, может в конечном итоге соответствовать,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