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

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' {} + 
  • Как отобразить только последнюю строку списка?
  • sed: -e выражение # 1, char 4: неизвестная команда:
  • Найдите и замените строку, если определенный шаблон найден в строке
  • Необходимо удалить - (минус) знак в конце в количестве из многих столбцов и вставить его на удаленные столбцы
  • частота появления
  • Как разобрать этот вывод и поместить его в массив?
  • Извлечь файлы csv из пути в несколько файлов в bash
  • ошибка при замене нескольких слов в строке с помощью sed
  • Sed заменяет части строк не начиная с http: //
  • Как извлечь первый код base64 из файла?
  • Хотите, чтобы rsync некоторые файлы после того, как они были sedded
  • извлечь столбец из большого текстового файла
  • Linux и Unix - лучшая ОС в мире.