sed пытается изменить имена хостов в файлах журналов, но - (da sh, минус) вызывает проблемы - PullRequest
2 голосов
/ 30 апреля 2020

Я новичок в sed и мне нужно изменить сотни имен хостов в ряде больших файлов журнала

например

URL:http://test-wls-1.compute-1234.cloud.internal .Response code: 503> 

Мне нужно изменить это значение на

URL:http[s]://hostname.compute-1234.cloud.internal: .Response code: 503>

Я пытался использовать sed regex

s'/http[s]\?:\/\/[^ ]./http[s]:\/\/hostname/'

, но так как da sh в хосте обрабатывается как слово, оно возвращает

URL:http[s]://hostname-wls-1.compute-1234.cloud.internal .Response code: 503> 

, поэтому нужно немного помогите понять где я иду не так

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

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

sed 's|http[s]\?://[^.]*|http[s]://hostname|'

http[s]\?://[^.]* получает строку между http:// или https:// и следующим символом точки (в вашем случае, то есть http://test-wls-1) и преобразует его в http[s]://hostname, что дает:

$ echo 'URL:http://test-wls-1.compute-1234.cloud.internal .Response code: 503>' |
    sed 's|http[s]\?://[^.]*|http[s]://hostname|'
URL:http[s]://hostname.compute-1234.cloud.internal .Response code: 503>

Ваша первоначальная попытка http[s]\?:\/\/[^ ]. соответствует http:// или https://, за которой следует любой не пробельный символ ( [^ ]) и любой другой символ (.). Таким образом, вывод будет

$ echo 'URL:http://test-wls-1.compute-1234.cloud.internal .Response code: 503>' |
    sed 's/http[s]\?:\/\/[^ ]./http[s]:\/\/hostname/'
URL:http[s]://hostnamest-wls-1.compute-1234.cloud.internal .Response code: 503>

. Видите, что te в test-... отсутствует в выводе.

1 голос
/ 30 апреля 2020

Вы можете использовать

sed 's~\(https\{0,1\}://\)[^.]\{1,\}~\1hostname~'  # POSIX BRE
sed -E 's~(https?://)[^.]+~\1hostname~'            # POSIX ERE

См. онлайн-демонстрацию :

s='URL:http://test-wls-1.compute-1234.cloud.internal .Response code: 503> '
sed 's~\(https\{0,1\}://\)[^.]\{1,\}~\1hostname~' <<< "$s"
# => URL:http://hostname.compute-1234.cloud.internal .Response code: 503> 

Подробности

  • \(https\{0,1\}://\) - группа 1 (обозначается \1 в запасной части): http или https, а затем :// string
  • [^.]\{1,\} - 1 или более символов, отличных от .
  • \1hostname - (RHS): значение группы 1 и подстрока hostname.
...