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

У меня есть проект Visual Studio, который разрабатывается локально. Файлы код должен быть развернут на удаленном сервере. Единственная проблема заключается в URLsthey содержать, которые жестко.

Проект содержит URL-адреса, такие как ?страница=одна . Ссылка должна быть действительна на сервере, он должен быть /Page/одна .

Я'вэ решил заменить все URL-адреса в моем codefiles с СЭД перед развертыванием, но я'м застрял на слеши.

Я знаю, что это не красивое решение, но это'ы просто сэкономило бы мне много времени. Общее количество строк, мне нужно заменить менее 10. Общее количество файлов, которые должны быть проверены составляет ~30.

Пример, описывающий мою ситуацию ниже:

Команду я'м с использованием:

sed -f replace.txt < a.txt > b.txt

replace.txt в котором содержатся все строки:

s/?page=one&/pageone/g
s/?page=two&/pagetwo/g
s/?page=three&/pagethree/g

a.txt:

?page=one&
?page=two&
?page=three&

Содержание b.txt после того, как я выполните мою команду sed:

pageone
pagetwo
pagethree

Что я хочу b.txt содержит:

/page/one
/page/two
/page/three
Комментарии к вопросу (2)
Решение

Самый простой способ будет использовать другой разделитель в поиск/замена строк, например:

s:?page=one&:pageone:g

Вы можете использовать любой символ в качестве разделителя, что'Не входить в состав любой строки. Или, вы можете защитить его с обратной косой чертой:

s/\//foo/

Что бы заменить / с Foo. Вы'd не хотите использовать избежал обратной косой черты в тех случаях, когда вы Don'т знать, какие символы могут возникать в строки замены (если они являются переменными оболочки, например).

Комментарии (8)

Команда ы можете использовать любой символ в качестве разделителя; любой персонаж после использования S имеет. Я был воспитан, чтобы использовать #. Вот так:

s#?page=one&#/page/one#g
Комментарии (4)

Очень полезный, но менее известный факт о СЭД заключается в том, что команды знакомы с именем/foo/бар/ можно использовать любые знаки препинания, не только Слэш. Типичная альтернатива-с@Фу@бар@, из которых становится понятно, как решить вашу проблему.

Комментарии (1)

добавить \ перед специальными символами:

s/\?page=one&/page\/one\//g

и т. д.

Комментарии (2)

В системе, которую я разрабатываю, строки должны быть заменены СЭД ввод текста от пользователя, который хранится в переменной и прошел к СЭД.

Как отмечалось ранее на этот пост, если строка содержится в команду sed блок содержит фактические разделителя используется СЭД - СЭД затем прекращается на синтаксические ошибки. Рассмотрим следующий пример:

Это работает:

$ VALUE=12345
$ echo "MyVar=%DEF_VALUE%" | sed -e s/%DEF_VALUE%/${VALUE}/g
MyVar=12345

Это нарушает:

$ VALUE=12345/6
$ echo "MyVar=%DEF_VALUE%" | sed -e s/%DEF_VALUE%/${VALUE}/g
sed: -e expression #1, char 21: unknown option to `s'

Заменив разделитель по умолчанию-это не надежное решение, в моем случае, как я не хочу, чтобы ограничить пользователя от ввода специфических символов, используемый в качестве разделителя (например, на "/") смотрите.

Однако, минуя все вхождения разделителей в строке ввода решило бы проблему. Рассмотрим ниже Решение систематически избежать разделителя символа во входной строке, прежде чем он обработан СЭД. Такое экранирование может быть реализован в качестве замены, используя сам СЭД, эта замена является безопасным, даже если входная строка содержит разделитель - это потому, что входная строка не является частью команды sed блока:

$ VALUE=$(echo ${VALUE} | sed -e "s#/#\\\/#g")
$ echo "MyVar=%DEF_VALUE%" | sed -e s/%DEF_VALUE%/${VALUE}/g
MyVar=12345/6

Я преобразовал это в функцию, чтобы быть использованы различные сценарии:

escapeForwardSlashes() {

     # Validate parameters
     if [ -z "$1" ]
     then
             echo -e "Error - no parameter specified!"
             return 1
     fi

     # Perform replacement
     echo ${1} | sed -e "s#/#\\\/#g"
     return 0
}
Комментарии (1)

эта линия должна работать на ваши 3 примера:

sed -r 's#\?(page)=([^&]*)&#/\1/\2#g' a.txt
  • Я , чтобы спасти убегающих .
  • линии должны быть универсальными для один, два, три случая. вы Don'т придется сделать саб в 3 раза

тест с вашим примером (a.txt):

kent$  echo "?page=one&
?page=two&
?page=three&"|sed -r 's#\?(page)=([^&]*)&#/\1/\2#g'
/page/one
/page/two
/page/three
Комментарии (0)

в

ООО - это [ОВtream Эдитор][человек], в том, что вы можете использовать | (труба), чтобы отправить стандартные потоки (stdin и stdout специально) через СЭД и изменить их программно на лету, превращая его в удобный инструмент в Unix философии традиции; но можете редактировать файлы прямо с помощью параметр, приведенный ниже. Учитывайте следующее:

sed -i -e 's/few/asd/g' hello.txt

ы/ используется для овubstitute найденного выражения несколько с АСД:

немногие отважные.


в АСД, храбрый.

стенды и"глобальных" и, намереваясь сделать это для всей линии. Если вы оставите у S/несколько/АСД/, там всегда должен быть в три раза несмотря ни на что) и "несколько" появляется дважды в той же строке, только сначала несколько меняется на АСД:

несколько мужчин, несколько женщин, храбрых.


АСД мужчин, несколько женщин, храбрых.

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

Следующие две опции (флаги) объединяются в одну, т. е.`:

-я опция используется для редактирования яn место по hello.txt файл``.

опция обозначает екоманда хргеѕѕіопбыл/запуска, в данном случае с/.

Примечание: это's важно, что вы используете -я -е для поиска/замены. Если вы делаете `-то есть, вы создаете резервную копию каждый файл с буквой 'е' добавлен.

[человека]: https://www.gnu.org/software/sed/manual/sed.txt "по странице"и

Комментарии (0)

`replace.txt должно быть

s/?page=/\/page\//g
s/&//g
Комментарии (0)

Отличный ответ от анонима. \ решена моя проблема, когда я пытался сбежать кавычки в HTML-строк.

Так что если вы используете sed, чтобы вернуть некоторые HTML-шаблоны (на сервере), используйте двойную обратную косую черту вместо одного:

var htmlTemplate = "<div style=\\"color:green;\\"></div>";
Комментарии (0)

Более простой альтернативой является с помощью awk, как на этот ответ:

в awk &#39;$0=на"префикс" и$0&#39; Файл > new_file

Комментарии (0)