У меня есть проект 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
Самый простой способ будет использовать другой разделитель в поиск/замена строк, например:
s:?page=one&:pageone:g
Вы можете использовать любой символ в качестве разделителя, что'Не входить в состав любой строки. Или, вы можете защитить его с обратной косой чертой:
s/\//foo/
Что бы заменить /
с Foo
. Вы'd не хотите использовать избежал обратной косой черты в тех случаях, когда вы Don'т знать, какие символы могут возникать в строки замены (если они являются переменными оболочки, например).
Команда ы
можете использовать любой символ в качестве разделителя; любой персонаж после использования S
имеет. Я был воспитан, чтобы использовать #
. Вот так:
s#?page=one&#/page/one#g
Очень полезный, но менее известный факт о СЭД заключается в том, что команды знакомы с именем/foo/бар/ можно использовать любые знаки препинания, не только Слэш. Типичная альтернатива-с@Фу@бар@
, из которых становится понятно, как решить вашу проблему.
добавить \ перед специальными символами:
s/\?page=one&/page\/one\//g
и т. д.
В системе, которую я разрабатываю, строки должны быть заменены СЭД ввод текста от пользователя, который хранится в переменной и прошел к СЭД.
Как отмечалось ранее на этот пост, если строка содержится в команду 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
}
эта линия должна работать на ваши 3 примера:
sed -r 's#\?(page)=([^&]*)&#/\1/\2#g' a.txt
-Р
, чтобы спасти убегающих .тест с вашим примером (a.txt):
kent$ echo "?page=one&
?page=two&
?page=three&"|sed -r 's#\?(page)=([^&]*)&#/\1/\2#g'
/page/one
/page/two
/page/three
в
ООО
- это [ОВ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 "по странице"и
`replace.txt должно быть
s/?page=/\/page\//g
s/&//g
Отличный ответ от анонима. \ решена моя проблема, когда я пытался сбежать кавычки в HTML-строк.
Так что если вы используете sed, чтобы вернуть некоторые HTML-шаблоны (на сервере), используйте двойную обратную косую черту вместо одного:
var htmlTemplate = "<div style=\\"color:green;\\"></div>";
Более простой альтернативой является с помощью awk, как на этот ответ:
в awk '$0=на"префикс" и$0' Файл > new_file