У меня есть проект Visual Studio, который разрабатывается локально. Файлы кода должны быть развернуты на удаленном сервере. Единственная проблема заключается в том, что URL содержат жестко запрограммированные URL.
Проект содержит URL-адреса, такие как ? Page = one . Чтобы ссылка действовала на сервере, она должна быть / page / one .
Я решил заменить все URL-адреса в моих кодовых файлах на sed перед развертыванием, но я застрял на слешах.
Я знаю, что это не очень хорошее решение, но оно просто сэкономило бы мне много времени. Общее количество строк, которые я должен заменить, меньше 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
Ответы:
Самый простой способ - использовать другой разделитель в строках поиска / замены, например:
Вы можете использовать любой символ в качестве разделителя, который не является частью какой-либо строки. Или вы можете избежать его с помощью обратной косой черты:
Что бы заменить
/
сfoo
. Вы бы хотели использовать экранированный обратный слеш в тех случаях, когда вы не знаете, какие символы могут встречаться в строках замены (например, если они являются переменными оболочки).источник
sed
которой команда regex заключена в двойные кавычки. Я не использовал их в своем ответе, потому что я показывал не всюsed
командную строку, а толькоsed
командную строку regex, как это делал OP. Если вы поместите его в файл, как это сделал ОП, вам не нужны кавычки.sed
команда в сценарии оболочки, тогда может потребоваться дополнительная обратная косая черта (каждая обратная косая черта должна быть снова возвращена).Команда
s
может использовать любой символ в качестве разделителя; какой бы символ не появлялся послеs
использования. Я был воспитан, чтобы использовать#
. Вот так:источник
Очень полезный, но менее известный факт о sed - это то, что знакомая
s/foo/bar/
команда может использовать любую пунктуацию, а не только косую черту. Распространенной альтернативой является тоs@foo@bar@
, из чего становится очевидным, как решить вашу проблему.источник
добавить \ перед специальными символами:
и т.п.
источник
s/foo\/bar/foo_bar/
будет работать, но/foo\/bar/foo_bar/
не будет.В системе, которую я разрабатываю, строка, которую нужно заменить на sed, - это вводимый пользователем текст, который сохраняется в переменной и передается в sed.
Как отмечалось ранее в этом посте, если строка, содержащаяся в командном блоке sed, содержит фактический разделитель, используемый sed - тогда sed завершается при синтаксической ошибке. Рассмотрим следующий пример:
Это работает:
Это ломает:
Замена разделителя по умолчанию не является надежным решением в моем случае, так как я не хотел ограничивать пользователя от ввода определенных символов, используемых sed в качестве разделителя (например, «/»).
Тем не менее, экранирование любых вхождений разделителя во входной строке решит проблему. Рассмотрим приведенное ниже решение систематического экранирования символа-разделителя во входной строке перед его анализом с помощью sed. Такое экранирование может быть реализовано как замена с использованием самого sed, эта замена безопасна, даже если входная строка содержит разделитель - это потому, что входная строка не является частью командного блока sed:
Я преобразовал это в функцию, которая будет использоваться различными сценариями:
источник
VALUE="01\\\/01\\\/2018"
эта строка должна работать для ваших 3 примеров:
-r
спасать побег.протестируйте на своем примере (a.txt):
источник
replace.txt
должно бытьисточник
Отличный ответ от Anonymous. \ решил мою проблему, когда пытался экранировать кавычки в строках HTML.
Поэтому, если вы используете sed для возврата некоторых HTML-шаблонов (на сервере), используйте двойную обратную косую черту вместо одинарной:
источник
sed
является s Tream ред itor , в том , что вы можете использовать|
(трубы) для передачи стандартных потоков (STDIN и STDOUT в частности) путемsed
и изменять их программно на лету, что делает его удобным инструментом в философии традиции Unix; но также можете редактировать файлы напрямую, используя-i
параметр, указанный ниже.Учтите следующее :
s/
используется для S ubstitute найденное выражениеfew
сasd
:/g
расшифровывается как «глобальный», что означает сделать это для всей строки. Если вы пропустите/g
(сs/few/asd/
, всегда должно быть три слэша, несмотря ни на что) иfew
появятся дважды в одной строке, только первыйfew
изменится наasd
:Это полезно в некоторых обстоятельствах, таких как изменение специальных символов в начале строк (например, замена символов «больше», которые некоторые люди используют для цитирования предыдущего материала в цепочках электронной почты, на горизонтальной табуляции, оставляя после этого цитируемое алгебраическое неравенство позже в строке нетронутым), но в вашем примере, где вы указываете, что где-либо
few
происходит, его следует заменить, убедитесь, что у вас есть/g
.Следующие два параметра (флаги) объединены в один
-ie
:-i
Опция используется для редактирования I п места на файлhello.txt
.-e
Опция указывает адрес XPression / команду для запуска, в данном случаеs/
.Примечание. Важно, что вы используете
-i -e
для поиска / замены. Если вы это сделаете-ie
, вы создадите резервную копию каждого файла с добавленной буквой «е».источник
Более простой альтернативой является использование AWK, как в этом ответе :
awk '$0="prefix"$0' file > new_file
источник