Выключение как косой черты, так и обратной косой черты с помощью sed

У меня есть следующая строка: /tmp/test/folder1/test.txt

Я хочу использовать sed для замены / для \/ – например:

 \/tmp\/test\/folder1\/test.txt 

Поэтому я выпускаю:

 echo "/tmp/test/folder1/test.txt" | sed "s/\//\\\\//g" 

Хотя он возвращает:

sed: -e выражение # 1, char 9: неизвестный параметр `s '

Я избегаю косой черты и обратной косой черты – поэтому не уверен, где я ошибся здесь

3 Solutions collect form web for “Выключение как косой черты, так и обратной косой черты с помощью sed”

Вам нужно сбежать (с \ ) все замещенные / и все обратные косые черты \ отдельно, так:

 $ echo "/tmp/test/folder1/test.txt" | sed 's/\//\\\//g' \/tmp\/test\/folder1\/test.txt 

но это довольно непроницаемо.

Однако sed позволяет использовать почти любой символ в качестве разделителя вместо / , это особенно полезно, когда вы хотите заменить slash / себя, как в вашем случае, поэтому, используя eg ; :

 $ echo "/tmp/test/folder1/test.txt" | sed 's;/;\\/;g' \/tmp\/test\/folder1\/test.txt 

Если вы хотите использовать двойные кавычки, все escape-обратные косые черты должны быть экранированы еще раз, чтобы сохранить свое буквальное значение:

 echo "/tmp/test/folder1/test.txt" | sed "s/\//\\\\\//g" 

и если кому-то не нужны котировки вообще, нужна еще одна обратная косая черта:

 echo "/tmp/test/folder1/test.txt" | sed s/\\//\\\\\\//g 

Или, если значение находится в переменной оболочки (bash):

 var=/tmp/test/folder1/test.txt $ echo "${var//\//\\\/}" \/tmp\/test\/folder1\/test.txt 

Первый // запуск расширения параметра , говорящий, чтобы заменить все совпадения на замену. Следующий \/ является экранированным / для соответствия, а \\\/ – экранированным \ за которым следует экранированный / в качестве замены.

Окончательное решение будет следующим:

 $ sed 's:/:\\/:g' <<<"$str" \/tmp\/test\/folder1\/test.txt 

Но объяснить, как туда добраться:
Да, вам не хватает одной обратной косой черты:

 $ str='/tmp/test/folder1/test.txt' $ sed "s/\//\\\\\//g" <<<"$str" \/tmp\/test\/folder1\/test.txt 

Я надеюсь, что одно место будет ясно:

 $ sed "s/\//\\\\ \//g" <<<"$str" \ /tmp\ /test\ /folder1\ /test.txt 

Но если вы изменили разделитель sed на : (например):

 $ sed "s:\/:\\\\\/:g" <<<"$str" \/tmp\/test\/folder1\/test.txt 

Но это не является строго правильным, поскольку (теперь не специальный) / не нуждается в scaping:

 $ sed "s:/:\\\\/:g" <<<"$str" \/tmp\/test\/folder1\/test.txt 

И, если вам нужно использовать одинарные кавычки вместо двойных кавычек, оболочка не изменит double \\ на единицу, так что будет меньше \ будет:

 $ sed 's:/:\\/:g' <<<"$str" \/tmp\/test\/folder1\/test.txt 

Это довольно чисто.

  • Получение ошибки RE: операнд-оператор повторения недействителен в osx sed
  • Согласование шаблонов и удаление этого шаблона с помощью sed
  • Как удалить несколько строк из файла с помощью оболочки
  • Замена XML на основе содержимого атрибута с помощью sed
  • Как манипулировать CSV-файлом с помощью sed или awk?
  • Как распечатать строку, если эта строка или следующая строка не содержат определенную строку
  • Редактирование столбцов с помощью awk или sed. как напечатать следующий шаблон?
  • Объяснение sed в сценарии оболочки
  • Строка печати содержит максимальное и минимальное значение
  • Как исправить непревзойденное количество блоков в 2 столбцах
  • Как использовать команду оболочки, чтобы показывать только первый столбец и последний столбец в текстовом файле?
  • Linux и Unix - лучшая ОС в мире.