Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何使bash参数替换正常工作?_Regex_Bash_Substitution - Fatal编程技术网

Regex 如何使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),用于获取主机的表达式(即符号和符号之间的部分:符号)给出错误替换错误。是否有一种简单/优雅的方法将此表达式固定在一行中,以便提取原始

我有一个bash变量,比如

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:更新的版本已经适用于这两种情况(用户存在-用户不存在)。我看不出你编辑的原因。