在Bash中拆分字符串以打印以“-”分隔的前两个字符

时间:2019-06-19 04:56:58

标签: bash

我正在列出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 :(得分:0)

如何使用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将其拔出并用那些替换掉整个内容。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

使用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"

答案 3 :(得分:0)

怎么样:

region="us-east-1"
echo "$region" | (IFS=- read -r a b c; echo "$a${b:0:1}${c:0:1}")
use1

答案 4 :(得分:0)

简单的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 ...之类的东西。