Как заменить строки, содержащие слэши с помощью 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
Самый простой способ будет использовать другой разделитель в поиск/замена строк, например:
Вы можете использовать любой символ в качестве разделителя, что'Не входить в состав любой строки. Или, вы можете защитить его с обратной косой чертой:
Что бы заменить
/
сFoo
. Вы'd не хотите использовать избежал обратной косой черты в тех случаях, когда вы Don'т знать, какие символы могут возникать в строки замены (если они являются переменными оболочки, например).Команда
ы
можете использовать любой символ в качестве разделителя; любой персонаж после использованияS
имеет. Я был воспитан, чтобы использовать#
. Вот так:Очень полезный, но менее известный факт о СЭД заключается в том, что команды знакомы с именем/foo/бар/
можно использовать любые знаки препинания, не только Слэш. Типичная альтернатива-с@Фу@бар@
, из которых становится понятно, как решить вашу проблему.добавить \ перед специальными символами:
и т. д.
В системе, которую я разрабатываю, строки должны быть заменены СЭД ввод текста от пользователя, который хранится в переменной и прошел к СЭД.
Как отмечалось ранее на этот пост, если строка содержится в команду sed блок содержит фактические разделителя используется СЭД - СЭД затем прекращается на синтаксические ошибки. Рассмотрим следующий пример:
Это работает:
Это нарушает:
Заменив разделитель по умолчанию-это не надежное решение, в моем случае, как я не хочу, чтобы ограничить пользователя от ввода специфических символов, используемый в качестве разделителя (например, на "/") смотрите.
Однако, минуя все вхождения разделителей в строке ввода решило бы проблему. Рассмотрим ниже Решение систематически избежать разделителя символа во входной строке, прежде чем он обработан СЭД. Такое экранирование может быть реализован в качестве замены, используя сам СЭД, эта замена является безопасным, даже если входная строка содержит разделитель - это потому, что входная строка не является частью команды sed блока:
Я преобразовал это в функцию, чтобы быть использованы различные сценарии:
эта линия должна работать на ваши 3 примера:
-Р
, чтобы спасти убегающих .тест с вашим примером (a.txt):
в
ООО
- это [ОВtream Эдитор][человек], в том, что вы можете использовать|
(труба), чтобы отправить стандартные потоки (stdin и stdout специально) черезСЭД
и изменить их программно на лету, превращая его в удобный инструмент в Unix философии традиции; но можете редактировать файлы прямо с помощью-я
параметр, приведенный ниже. Учитывайте следующее:ы/
используется для овubstitute найденного выражениянесколько
сАСД
:стенды
/г
и"глобальных" и, намереваясь сделать это для всей линии. Если вы оставите у/г
(сS/несколько/АСД/
, там всегда должен быть в три раза несмотря ни на что) и "несколько" появляется дважды в той же строке, только сначаланесколько
меняется наАСД
:Это полезно в некоторых случаях, как изменение специальные символы в начале строки (например, замена более чем символы, некоторые люди используют, чтобы цитировать предыдущего материала в электронной переписке с горизонтальной вкладке, оставляя цитирует алгебраические неравенства позже в линейке нетронутый), но в вашем примере, где указано, что любой
несколько
происходит, он должен быть заменен, убедитесь, что у вас которые/г
.Следующие две опции (флаги) объединяются в одну, т. е.`:
-я опция используется для редактирования яn место по hello.txt файл``.
опция
-Е
обозначает екоманда хргеѕѕіопбыл/запуска, в данном случаес/
.Примечание: это's важно, что вы используете
-я -е
для поиска/замены. Если вы делаете `-то есть, вы создаете резервную копию каждый файл с буквой 'е' добавлен.[человека]: https://www.gnu.org/software/sed/manual/sed.txt "по странице"и
`replace.txt должно быть
Отличный ответ от анонима. \ решена моя проблема, когда я пытался сбежать кавычки в HTML-строк.
Так что если вы используете sed, чтобы вернуть некоторые HTML-шаблоны (на сервере), используйте двойную обратную косую черту вместо одного:
Более простой альтернативой является с помощью awk, как на этот ответ:
в awk '$0=на"префикс" и$0' Файл > new_file