#linux #регулярные_выражения #bash
Категорически приветствую! Существует некий скрипт, в переменной которого содержится строка: 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)
Ответы
Ответ 1
Вы можете использовать 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} - в конце удяляем последнюю запятую.Ответ 2
Раз стоит bash добавлю свой вариант тоже: #!/usr/bin/env bash # file : var-cut.sh var_string="hello-1.my.domain.local hello-world-12.two.domain.local hello-7.three.domain.local hello-world-16.my.domain.local" for split in ${var_string//.domain.local}; do echo $split done | paste -d"," -s - echo echo "${var_string//.domain.local/,}" # end of var-cut.sh вывод ~$ ./var-cut.sh hello-1.my,hello-world-12.two,hello-7.three,hello-world-16.my hello-1.my, hello-world-12.two, hello-7.three, hello-world-16.my,