Как передать переменную, содержащую слэши, для sed

Я действительно знаю ответ на этот вопрос, однако не раз я видел, как некоторые мои сверстники застряли в этом вопросе, поэтому я подумал, что было бы целесообразно документировать его на SO. Если вопрос уже существует, я с удовольствием удалю его.

Итак, вот оно …

Как передать переменную, содержащую косые черты, как шаблон для sed .

Например, если у меня есть следующая переменная:

 var="/Users/Documents/name/file" 

Я хочу передать его sed так:

 sed "s/$var/replace/g" $file 

Однако я получаю ошибки. Как я могу обойти проблему?

Используйте альтернативный разделитель регулярных выражений, поскольку sed позволяет использовать любой разделитель ( включая управляющие символы ):

 sed "s~$var~replace~g" $file 

Чистый ответ bash: используйте расширение параметра для обратной косой черты – избегайте любых косых черт в переменной:

 var="/Users/Documents/name/file" sed "s/${var//\//\\/}/replace/g" $file 

Другой способ сделать это, хотя и более уродливый, чем ответ анубхавы, заключается в том, чтобы избежать всех обратных косых черт в var используя другую команду sed :

 var=$(echo "$var" | sed 's/\//\\\//g') 

то это будет работать:

 sed "s/$var/replace/g" $file 

Использование / in sed в качестве разделителя будет конфликтовать с косой чертой в переменной при замене, и в результате вы получите сообщение об ошибке. Один из способов обойти это – использовать другой разделитель, который уникален для любых символов, находящихся в этой переменной.

 var="/Users/Documents/name/file" 

вы можете использовать символ octothorpe, который подходит для случая (или любого другого персонажа, который не является / для удобства использования)

 sed "s#$var#replace#g" 

или

  sed 's#$'$var'#replace#g' 

это подходит, когда переменная не содержит пробелов

или

 sed 's#$"'$var'"#replace#g' 

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

Альтернативный разделитель работает только тогда, когда есть необходимость в поиске и замене. В случаях, когда необходимо удалить строки из файла на основе слова, содержащего / (например, /dev/sda1 ), это не сработает. Например:

 var1=/dev/sda1 sed -i ":$var1:d" $file 

Я хотел бы пойти с решением, предложенным @Bolboa

  • Как выводить только захваченные группы с sed?
  • Извлечение данных из простого XML-файла
  • Вставить строку после первого совпадения с помощью sed
  • Удалите первые N строк файла в командной строке unix
  • Мне нужна моя команда sed -i для редактирования на месте для работы как с GNU sed, так и с BSD / OSX
  • Новые строки в sed на Mac OS X
  • Заменить слово несколькими строками с помощью sed?
  • Замените все пробелы меткой разрыва строки / абзаца, чтобы сделать список слов
  • Как выполнить рекурсивный поиск / замену строки с помощью awk или sed?
  • поиск и замена целого слова
  • Удалить строки в текстовом файле, который содержит определенную строку
  • Давайте будем гением компьютера.