2015-07-15 8 views
0

Мне нужно изменить некоторые пути Windows.Escape символ обратной косой черты в sed

Например,

D:\usr 

в

D:\first\usr 

Итак, я создал переменную.

$path = "first\usr" 

затем использовали следующую команду:

sed -i -e 's!\\usr!${path}/g;' test.txt 

Однако, это заканчивается следующим:

D:\firstSr 

Как избежать \u в СЭД?

+0

Возможный дубликат [Почему sed требует 3 обратных косых черт для регулярной обратной косой черты?] (Http://stackoverflow.com/questions/2369314/why-does-sed-require-3-backslashes-for-a-regular- обратная косая черта) – Risadinha

+0

вам нужно удвоить доступ к содержимому нового значения, а не только шаблон поиска sed – NeronLeVelu

+0

Какую оболочку или язык сценариев вы используете? '$ path =" first \ usr "' выглядит как Perl, но остальное не ... –

ответ

2

Предполагая, что ваша path переменная была назначена правильно (без пробелов в назначении: path='first\usr'), шаг за шагом фиксации для входного файла test.txt с один пример пути:

$ cat test.txt 
D:\usr 
  1. Ваша оригинальная команда

    $ sed 's!\\usr!${path}/g;' test.txt 
    sed: -e expression #1, char 18: unterminated `s' command 
    

    не делает много, так как вы смешали ! и / в качестве разделителя.

  2. Фиксирующие разделители:

    $ sed 's!\\usr!${path}!g;' test.txt 
    D:${path} 
    

    Теперь Интерполяция не происходит вовсе не из-за одинарные кавычки. Я подозреваю, что это просто ошибки копирования, поскольку вы, очевидно, получили некоторые результаты.

  3. двойные кавычки:

    $ sed "s!\\usr!${path}!g" test.txt 
    bash: !\\usr!${path}!g: event not found 
    

    Теперь это конфликтует с history expansion. Мы могли бы избежать ! или использовать другой разделитель.

  4. / в качестве разделителя:

    $ sed "s/\\usr/${path}/g" test.txt 
    D:\firstSr 
    

    Теперь мы где на самом деле начали вопрос. ${path} расширяется до first\usr, но \u имеет специальное значение в GNU sed в заменяющей строке: он имеет верхний регистр следующего символа, следовательно S.

    Даже без особого значения, \u, скорее всего, просто расширится до u, а обратная косая черта исчезнет.

  5. Экранирование обратной косой черты:

    $ path='first\\usr' 
    $ sed "s/\\usr/${path}/g" test.txt 
    D:\first\usr 
    

    Это работает.

0

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

path="first\usr" 
sed -e "s/\\usr/${path//\\/\\\\}/g" <<< "D:\usr" 

Синтаксис для замены шаблона с расширением параметра оболочки ${parameter/pattern/string} (одна замена) или ${parameter//pattern/string} (замените все совпадения).

Эта подстановка не указана POSIX, но доступна в Bash.

Где это не доступно, то, возможно, придется фильтровать $path через процесс:

path=$(echo "$path" | sed 's/[][\\*.%$]/\\&/g') 

(нотабене я также процитировал другие SED метасимволы в этом фильтре).

Смежные вопросы