2016-12-13 3 views
0

В файле моего репозитория Linux есть ссылка, которая до сих пор использовала http с номером порта, чтобы указать на его репозиторий.Как отредактировать строку url с sed

BaseUrl = http://host.domain.com:123/folder1/folder2

я теперь нужен способ, чтобы заменить этот URL, чтобы использовать протокол HTTPS, без порта или другой порт. Мне также нужно изменить имя сервера, например, с host.domain.com на host2.domain.com

Итак, моя идея состояла в том, чтобы использовать sed для поиска начала http до первого/после того, как 2 // таким образом поймает все, что между ними, и даст мне возможность изменять порт сервера или использование http \ s.

Im теперь использую этот код (им с помощью эха только для примера):

пример показывает, как в 2-х случаях, когда один раз у меня есть связь с HTTP и порт 123 преобразуются в HTTPS и во второй раз другой путь вокруг и оба кода я использовал один и тот же sed по общим причинам.

WANTED_URL="https://host.domain.com" 
echo 'http://host.domain.com:123/folder1/folder2' | sed -i "s|http.*://[^/]*|$WANTED_URL|" 

ИЛИ

WANTED_URL="http://host.domain.com:123" 
echo 'https://host.domain.com/folder1/folder2' | sed -i "s|http.*://[^/]*|$WANTED_URL|" 

является то, что правильный способ сделать это?

+0

что я хочу поймать его до косой черты и от http, поэтому мне всегда нужно будет добавить только полный URL-адрес (с портом или без него). –

+0

Ни один из ответов не работает для вас? –

+0

Да, это работает в обоих направлениях –

ответ

2

sed регулярные выражения по-прежнему жадные. Вы можете сказать, sed потреблять только не-косые черты, например:

echo 'http://host.domain.com:123/folder1/folder2' | sed -e 's|http://[^/]*|https://host.domain.com|' 

результат:

https://host.domain.com/folder1/folder2 

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

ключ использует [^/]*, который будет соответствовать чему-либо , но слэши, чтобы он не совпадал с первой косой чертой (не жадным).

Вы использовали /.*/ и .* могут содержать косые черты, а не то, что вы хотели (жадный по умолчанию).

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

+0

, который работает.can u, пожалуйста, объясните [^ /] * –

+0

для более подробной информации. –

+1

@ EdMorton в порядке, отредактирован. Обратите внимание, что я не использую его в своем ответе. Мне нравится, когда это возможно, всегда, когда это возможно, всегда проверяя мои ответы с использованием 1975-ss' на моей рабочей станции multics (просто шутит :)) –

1

Если предположить, что на самом деле не имеет значения, если у вас есть 1 патч в сценарий или 2, и есть не очень хорошая причина, чтобы жестко кодировать URL-адреса:

$ echo 'http://host.domain.com:123/folder1/folder2' | 
    sed 's|\(:[^:]*\)[^/]*|s\1|' 
https://host.domain.com/folder1/folder2 

$ port='123'; echo 'https://host.domain.com/folder1/folder2' | 
    sed 's|s\(://[^/]*\)|\1:'"$port"'|' 
http://host.domain.com:123/folder1/folder2 

Если это не то, что вам нужно, то редактировать свой вопрос, чтобы уточнить ваши требования и, в частности, объясняет, почему:

  1. Вы хотите использовать жестко закодированные URL-адрес, и
  2. Вам нужно 1 скрипт делать оба преобразования.

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

WRT, что вы имели:

WANTED_URL="https://host.domain.com" 
echo 'http://host.domain.com:123/folder1/folder2' | sed -i "s|http.*://[^/]*|$WANTED_URL|" 

Основные вопросы:

  1. Не используйте все-прописные для имен переменных неэкспортированной оболочки, чтобы избежать столкновения с экспортированных переменных и чтобы избежать обфускации вашего кода (это соглашение существует около 40 лет, поэтому люди ожидают, что все переменные верхнего регистра будут экспортированы).
  2. Ни в коем случае не добавляйте скрипт в двойные кавычки, поскольку он предоставляет весь сценарий оболочке для интерпретации, прежде чем команда, которую вы хотите выполнить, даже видит ее. Вместо этого просто открывайте одиночные кавычки вокруг самого маленького сегмента сценария, который возможен, когда это необходимо, то есть для расширения $y в сценарии используйте cmd 'x'"$y"'z' не cmd "x${y}z", потому что последний будет ошибочно и опасно получать различные входные данные, текст сценария, настройки среды и/или содержимое каталог, из которого вы его запускаете.
  3. Параметр -i для sed предназначен для редактирования файла на месте, поэтому вы не можете использовать его на входящем канале, потому что вы не можете редактировать трубку на месте.
  4. Когда вы позволяете переменной оболочки расширяться, чтобы стать частью скрипта, вы должны позаботиться о возможных символах, которые она содержит, и о том, как они будут интерпретироваться командой, заданной контекстом, в котором переменная расширяется. Если вы укажете весь URL-адрес в секцию замены скрипта sed, тогда вы должны быть осторожны, чтобы сначала избежать любых потенциальных символов обратной ссылки или разделителей сценариев. См. Is it possible to escape regex metacharacters reliably with sed. Если вы просто позволите номер порта развернуть, вам не придется иметь дело с этим.
Смежные вопросы