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

Я обнаружил, что использование printfвместо echoрешило проблему. Вместо

PROMPT_COMMAND='echo -ne "\033]30;$(basename $(pwd))\007"'

Теперь у меня есть

export PROMPT_COMMAND='printf "\033]0;%s\007" "$(basename $(pwd))"'
1
01.06.2021, 17:49
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' 

NOTE*: this replaces test.com with set.com

0
28.07.2021, 11:27

Предполагая, что система 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 или более (+, расширенный оператор регулярного выражения, поэтому символы -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содержит /,проще использовать другой символ в качестве разделителя, чем экранировать /обратной косой чертой, что затрудняет чтение. Следовательно, здесь s|regexp|replacement|gвместо s/regexp/replacement/g. Мне нравится |, так как это делает код разборчивым. У него есть недостаток, заключающийся в том, что его нельзя использовать в ex/ vi, s/regex/replacement/хотя, поскольку |разделяет exкоманды там (, это также расширенный оператор регулярного выражения ).
4
28.07.2021, 11:27

Теги

Похожие вопросы