Я обнаружил, что использование printf
вместо echo
решило проблему. Вместо
PROMPT_COMMAND='echo -ne "\033]30;$(basename $(pwd))\007"'
Теперь у меня есть
export PROMPT_COMMAND='printf "\033]0;%s\007" "$(basename $(pwd))"'
Попробуйте это:
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'
NOTE*: this replaces test.com with set.com
Предполагая, что система 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 или более :
с. Здесь мы заменяем его на [^/[: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
содержит /
,проще использовать другой символ в качестве разделителя, чем экранировать /
обратной косой чертой, что затрудняет чтение. Следовательно, здесь s|regexp|replacement|g
вместо s/regexp/replacement/g
. Мне нравится |
, так как это делает код разборчивым. У него есть недостаток, заключающийся в том, что его нельзя использовать в ex
/ vi
, s/regex/replacement/
хотя, поскольку |
разделяет ex
команды там (, это также расширенный оператор регулярного выражения ).