Страницы

Поиск по вопросам

вторник, 5 февраля 2019 г.

Обрезать строку в переменной

Категорически приветствую! Существует некий скрипт, в переменной которого содержится строка: hello-1.my.domain.local hello-world-12.two.domain.local hello-7.three.domain.local hello-world-16.my.domain.local
Подскажите пожалуйста наиболее рациональный и правильный способ приведения этой строки к виду hello-1.my,hello-world-12.two,hello-7.three,hello-world-16.my
Сейчас я делаю это так:
VAR2=`echo $VAR1 | sed 's/.domain.local/,/g;s/ //g;s/,$//'`
Что на мой взгляд отвратительно (хотя бы из-за хардкода .domain.local)


Ответ

Вы можете использовать
sed -E 's/(\.[^.]+){2}([ \t]+|$)/,/g; s/,$//'
См. демо онлайн
Шаблон (\.[^.]+){2}([ \t]+|$) находит две последовательности ((...){2}) "точка" (\.) + "один и более символов, отличных от точки" ([^.]+), за которым следует один и более пробелов ([ \t]+) или символов табуляции или (|) конец строки ($), и заменяет на запятую. s/,$// необходим для удаления запятой, добавленной в конце строки.
Версия с awk
awk 'BEGIN {FS=OFS="."; RS=" "; ORS=","} {NF-=2;print}' | sed 's/,$//'
И более продвинутая версия без необходимости в sed
awk 'BEGIN {FS=OFS="."; RS=" "} {NF-=2; l=l $0 ","} END{sub(/,$/, "", l); print l}'
См. онлайн-демо
Кратко:
BEGIN {FS=OFS="."; RS=" "} - FS=OFS="." задают разделитель полей (символ ) при чтении и записи, а RS=" " задаёт разделитель строк (пробел) {NF-=2; l=l $0 ","} - уменьшаем кол-во полей на 2 для каждой строки и добавляем значение строки к переменной l + запятая END{sub(/,$/, "", l); print l} - в конце удяляем последнюю запятую.

Комментариев нет:

Отправить комментарий