Различия между sed #,%, / и |

Я пытаюсь заменить строку в базе данных. Я нашел возможные решения ниже. Использование # или % работает со мной, но не для / и | , Может ли кто-нибудь объяснить, почему первые две работы и какие различия между ними, пожалуйста?

 find . -type f -name 'file.sql' -exec sed -i '' s#http://a.com#http://b.com#g {} + find . -type f -name 'file.sql' -exec sed -i '' s%http://a.com%http://b.com%g {} + find . -type f -name 'file.sql' -exec sed -i '' s/http://a.com/http://b.com/g {} + find . -type f -name 'file.sql' -exec sed -i '' s|http://a.com|http://b.com|g {} + 

  • вопрос о совпадении пробелов
  • Grepping для блока текста с частями, которые могут быть необязательными
  • Как я могу удалить пятое слово каждой строки в файле?
  • Регулярные выражения для дезинфекции телефонных номеров
  • Сравнить и объединить конфигурационный файл в CentOS
  • как использовать SED для замещения комментариев в разделе комментариев
  • Как вставить текст перед первой строкой файла?
  • Сравните 2 файла, если он находится между диапазоном чисел
  • One Solution collect form web for “Различия между sed #,%, / и |”

    Команда замещения Sed обычно использует / как разделитель между командой s , строкой поиска, заменяющей строкой и любыми флагами. Если, однако, любая строка поиска или строка замены может содержать / , то люди будут изменять разделитель на символ, который не находится ни в одной из строк.

    Вы получили другую ошибку от sed, когда вы сказали ей использовать пустую строку в качестве расширения для резервного копирования; поскольку вы не используете расширение, не помещайте пустые кавычки.

    Седу все равно, что такое разделитель, но твоя окружающая оболочка может.

    | символ вводит трубку. Чтобы использовать его как разделитель, вам придется процитировать его каким-то образом, чтобы защитить их от оболочки.

    Символ # может вводить строку комментария на основе вашей оболочки (bash только начинает комментарий, если # является первым символом слова), поэтому лучше быть в безопасности и процитировать его.

    Так как ваши данные содержат / символы, вам нужно либо использовать другой разделитель, либо избежать каждого экземпляра / в строке поиска и замены. Это приводит к тому, что известно как синдром наклона зубочистки из-за трудно читаемого внешнего вида \/ .

    Таким образом, вам нужно что-то вроде:

     find . -type f -name 'file.sql' -exec sed -i -e 's#http://a.com#http://b.com#g' {} + 

    или

     find . -type f -name 'file.sql' -exec sed -i -e 's|http://a.com|http://b.com|g' {} + 

    или

     find . -type f -name 'file.sql' -exec sed -i -e "s|http://a.com|http://b.com|g" {} + 

    или

     find . -type f -name 'file.sql' -exec sed -i -e 's/http:\/\/a.com/http:\/\/b.com/g' {} + 
    Linux и Unix - лучшая ОС в мире.