从变量中挑选值

时间:2013-08-28 15:03:05

标签: bash shell sed awk

我的shell脚本中有一个变量,如下所示:

DIR="HOME_X_Y_Z";

它表示目录名称。想象一下,我有多个目录都命名为:

HOME_1_2_Z/
HOME_9_A_Z/
HOME_3_5_Z/
etc...

唯一更改的值是位于 X Y 位置的值。是否有正则表达式我可以使用(可能使用sed或awk)来剥离这些值?我希望能够在我的脚本中的其他地方独立使用它们。

所以我可以再增加两个变量:

X_VALUE="";
Y_VALUE=""; 

由于

4 个答案:

答案 0 :(得分:4)

设置IFS并使用read

IFS=_ read home x y z rest <<< 'HOME_X_Y_Z'
echo "$y" # "Y"
echo "$z" # "Z"
echo "$x" # "X"

答案 1 :(得分:1)

纯粹的bash非常容易:

IFS='_' read X_VALUE Y_VALUE Z_VALUE <<< "${DIR#*_}"

说明:
因此,${DIR#*_}将从字符串的开始移除最短匹配。有关此类更多信息,请参阅parameter expansion cheat sheet

echo ${DIR#*_} # returns X_Y_Z

之后我们要做的就是将默认IFS更改为_并读取我们的值。

答案 2 :(得分:1)

如果你不想摆弄IFS,你仍然可以通过剥离你不想要的部分来完成纯粹的Bash,但它不是单行的:

DIR2=${DIR#HOME_}
DIR2=${DIR2%_Z}      # $DIR now contains just X_Y
X_VALUE=${DIR2%_*}
Y_VALUE=${DIR2#*_}

答案 3 :(得分:0)

好的,但如果$HOME确实包含_个字符,该怎么办?

为了离开IFS,我们必须存储,而不是恢复它们:

DIR="/blah/disk nr_1/home_12_24_zz"
O_IFS="$IFS"
IFS='_'
read -a S_ARRAY <<< "$DIR"
z_VALUE=${S_ARRAY[-1]}
Y_VALUE=${S_ARRAY[-2]}
X_VALUE=${S_ARRAY[-3]}
HOME="${S_ARRAY[*]:0:${#S_ARRAY[@]}-3}"
IFS="$O_IFS"

printf "Home: '%s'\nx: '%s'\ny: '%s'\n" "$HOME" "$X_VALUE" "$Y_VALUE"
Home: '/blah/disk nr_1/home'
x: '12'
y: '24'

说明:

然后语法${S_ARRAY[*]}将使用第一个IFS字符合并所有字段。因此,IFS必须存在于当前执行级别,才能将/blah/disk nr1/home合并为下划线_