我的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="";
由于
答案 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 nr
与1/home
合并为下划线_
。