Различия между 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 {} + 

  • Как использовать аргументы с 'find -exec'?
  • Присоединиться: два файла - но только добавить последние два столбца
  • как удалить строку из файла XML
  • Возможно ли, с `sed` или иначе, применить преобразование регулярных выражений к входному потоку, который не может содержать строки новой строки?
  • проверять содержимое файла с помощью регулярных выражений bash
  • Ошибка Sed, заменяющая частичную строку переменной
  • Как искать и заменять строку символами новой строки в командной строке в файле
  • Найти последнее появление строки в заданном типе файла во всех подкаталогах
  • Как разбить список имен файлов в наборах 5 ГБ?
  • Сравните наборы значений из двух файлов и распечатайте вывод в третьем файле с помощью awk
  • извлекать текст между двумя разными совпадениями
  • Как печатать IP / MASK из списка?
  • 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 - лучшая ОС в мире.