我的 shell 脚本中有一个变量,如下所示:
DIR="HOME_X_Y_Z";
它代表一个目录名称。想象一下,我有多个目录都命名为:
HOME_1_2_Z/
HOME_9_A_Z/
HOME_3_5_Z/
etc...
唯一改变的值是位于X和Y位置的值。有没有我可以使用的正则表达式(可能使用 sed 或 awk)来剥离这些值?我希望能够在脚本的其他地方独立使用它们。
所以我可以再有 2 个变量:
X_VALUE="";
Y_VALUE="";
谢谢
设置 IFS 并使用read
:
IFS=_ read home x y z rest <<< 'HOME_X_Y_Z'
echo "$y" # "Y"
echo "$z" # "Z"
echo "$x" # "X"
如果您不想摆弄 IFS,您仍然可以在纯 Bash 中通过剥离您不想要的部分来完成它,但这不是单线:
DIR2=${DIR#HOME_}
DIR2=${DIR2%_Z} # $DIR now contains just X_Y
X_VALUE=${DIR2%_*}
Y_VALUE=${DIR2#*_}
使用纯 bash 这很容易:
IFS='_' read X_VALUE Y_VALUE Z_VALUE <<< "${DIR#*_}"
解释:
所以,${DIR#*_}
将从字符串的开头删除最短匹配。有关更多类似内容,请参阅参数扩展备忘单。
echo ${DIR#*_} # returns X_Y_Z
之后,我们要做的就是将默认 IFS 更改为_
并读取我们的值。