Regex 如何使bash参数替换正常工作?
我有一个bash变量,比如Regex 如何使bash参数替换正常工作?,regex,bash,substitution,Regex,Bash,Substitution,我有一个bash变量,比如 var=root@283.45.67.89:/root/test 并希望访问不同的部分(用户、主机、路径,其中用户是可选的)。我试过: path=${var#*:*} user=${var%*@*} host=${{var#*@*}%*:*} 当路径和用户的表达式按预期工作时(即用户具有字符串根和路径具有字符串/root/test),用于获取主机的表达式(即符号和符号之间的部分:符号)给出错误替换错误。是否有一种简单/优雅的方法将此表达式固定在一行中,以便提取原始
var=root@283.45.67.89:/root/test
并希望访问不同的部分(用户、主机、路径,其中用户是可选的)。我试过:
path=${var#*:*}
user=${var%*@*}
host=${{var#*@*}%*:*}
当路径
和用户
的表达式按预期工作时(即用户
具有字符串根
和路径
具有字符串/root/test
),用于获取主机
的表达式(即
符号和符号之间的部分:
符号)给出错误替换
错误。是否有一种简单/优雅的方法将此表达式固定在一行中,以便提取原始变量的“中间”部分
附加信息:当没有用户时,它也必须工作,即在以下没有用户(且没有“@”符号)的情况下,变量user
必须为空,但其他变量必须相应地填充:
var=283.45.67.89:/root/test
我期待以下结果
path=/root/test
host=283.45.67.89
user=
使用小写变量名$PATH和$USER是特殊的 要分析字符串,可以使用正则表达式:
[[ $var =~ (.*)@(.*):(.*) ]]
user=${BASH_REMATCH[1]}
host=${BASH_REMATCH[2]}
path=${BASH_REMATCH[3]}
更新:
对于可能缺少的用户,可以将其更改为
[[ @$var =~ (.*)@(.*):(.*) ]]
user=${BASH_REMATCH[1]#@}
临时变量(tmp)可能会修正替换错误严重的问题,无论是否有用户:
path=${var#*:} # Get path
tmp=${var%:*} # Get all before ":"
host=${tmp#*@} # Get host by removing any user and "@"
tmp=${tmp%${host}} # Get any user and "@" by prevoving host
user=${tmp%@} # Remove any "@" from user
感谢您注意使用小写变量。另外,我忘了提到,如果没有指定用户,则替换必须有效…@chepner:更新的版本已经适用于这两种情况(用户存在-用户不存在)。我看不出你编辑的原因。