Выключение как косой черты, так и обратной косой черты с помощью 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 

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

  • Как включить все до Colon в Sed / Grep / ...?
  • Замена шаблона соответствия совпадению с помощью sed
  • Замените все цифры номера социального страхования (SSN) на X
  • Условно разбить столбцы на 2 строки?
  • Как заменить значения в строке с помощью sed, но сохранить строку неповрежденной
  • Удалить последнюю строку из файла
  • Селективное извлечение данных
  • вырезать последние два с sed?
  • Удаление набора записей, если найденный шаблон
  • Объедините вывод из df -h / dev / xvda1 в одну строку
  • Как заменить строку на точное совпадение строки
  • Interesting Posts

    Манипулирование (non-root) паролем в Fedora 22

    qtconfig инструмент для Qt 5?

    Содержит ли жесткие ссылки обычные файлы?

    генерировать согласованный уникальный идентификатор машины в программировании c

    Мой компьютер не может просматривать подключение только к определенной точке беспроводной связи, но другие работают

    Есть ли способ включить Ctrl + L для очистки экрана при установке «set -o vi»?

    Лучшие варианты установки жесткого диска Mac OS X на моем Linux-боксе?

    Bluetooth не работает в новой установке Mint Maya

    удалять строки, которые суммируются до нуля

    Отклонить разрешение на перемещение мягкой ссылки

    sed, чтобы заменить строку из одного файла на все содержимое другого файла

    Почему скорость загрузки yum слишком медленная

    sed error: «\ 1 не определено в RE» под OS X

    Как получить доступ к общим местам на машине Windows с помощью Linux-терминала через терминал?

    разрешение запрещено на ~ / .ssh для его владельца!

    Linux и Unix - лучшая ОС в мире.