Разбить строку, чтобы напечатать первые два символа, разделенные знаком "-" в Bash - PullRequest
0 голосов
/ 19 июня 2019

Я перечисляю имена регионов AWS.

us-east-1
ap-southeast-1

Я хочу разбить строку, чтобы напечатать конкретные первые символы, разделенные -, то есть «два символа» - «один символ» - «один символ»».Поэтому us-east-1 должно быть напечатано как use1, а ap-southeast-1 должно быть напечатано как aps1

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

region=us-east-1 
regionlen=$(echo -n $region | wc -m) 
echo $region | sed 's/-//' | cut -c 1-3,expr $regionlen - 2-expr $regionlen - 1 

Ответы [ 5 ]

0 голосов
/ 19 июня 2019

Простой sed -

$: printf "us-east-1\nap-southeast-1\n" |
     sed -E 's/-(.)[^-]*/\1/g'

Чтобы сохранить некардинальные спецификации, такие как southeast, отличные от south за счет добавления необязательного дополнительного символа -

$: printf "us-east-1\nap-southeast-1\n" |
   sed -E '
    s/north/n/;
    s/south/s/;
    s/east/e/;
    s/west/w/;
    s/-//g;'

Если у вас может быть south-southwest, добавьте g к этим направленным сокращениям.

, если вы ДОЛЖНЫ иметь ровно 4 символа вывода, я рекомендую сопоставить восемь или 16 направлений карты с конкретными символами, чтобы север былN, северо-восток, может быть, O и северо-запад M ... такие вещи.

0 голосов
/ 19 июня 2019

Как насчет:

region="us-east-1"
echo "$region" | (IFS=- read -r a b c; echo "$a${b:0:1}${c:0:1}")
use1
0 голосов
/ 19 июня 2019

IFS влияющий на шаг разделения поля расширения параметра:

$ str=us-east-2
$ IFS=- eval 'set -- $str'
$ echo $#
3
$ echo $1
us
$ echo $2
east
$ echo $3

Нет внешних утилит; просто обработка на языке.

Вот как грамотно написанные скрипты конфигурации сборки анализируют номера версий, такие как 1.13.4, и строки архитектуры, такие как i386-gnu-linux.

.

eval можно избежать, если мы сохраним и восстановим IFS.

$ save_ifs=$IFS; set -- $str; IFS=$save_ifs
0 голосов
/ 19 июня 2019

Используя bash и предполагая, что вам необходимо различать такие вещи, как юго-запад и юго-восток:

s=ap-southwest-1

a=${s:0:2}
b=${s#*-}
b=${b%-*}
c=${s##*-}

bb=
case "$b" in
south*) bb+=s ;;&
north*) bb+=n ;;&
*east*) bb+=e ;;
*west*) bb+=w ;;
esac

echo "$a$bb$c"
0 голосов
/ 19 июня 2019

Как насчет использования sed:

echo "$region" | sed -E 's/^(.[^-]?)[^-]*-(.)[^-]*-(.).*$/\1\2\3/'

Объяснение: команда s/pattern/replacement/ выбирает соответствующие части имени региона, заменяя полное имя только соответствующими битами.Шаблон выглядит так:

^         - the beginning of the string
(.[^-]?)  - the first character, and another (if it's not a dash)
[^-]*     - any more things up to a dash
-         - a dash (the first one)
(.)       - The first character of the second word
[^-]*-    - the rest of the second word, then the dash
(.)       - The first character of the third word
.*$       - Anything remaining through the end

Биты в скобках фиксируются, поэтому \1\2\3 вытаскивает их и заменяет все это только на те.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...