Regex 在shell中提取子字符串的更优雅的方法

Regex 在shell中提取子字符串的更优雅的方法,regex,bash,Regex,Bash,我编写regex来获取chartname(auth令牌服务)。但这似乎很粗糙,有人能用更精确的方式来写吗 chartname=`echo my auth token service=xxx.azurecr.io/auth token service:latest | cut-d=-f1 | sed-e“s/^.*-/”` 不熟悉标记的格式,但如果我理解正确,您只需要斜杠后冒号前的部分 echo my auth token service=xxx.azurecr.io/auth token ser

我编写regex来获取chartname(auth令牌服务)。但这似乎很粗糙,有人能用更精确的方式来写吗

chartname=`echo my auth token service=xxx.azurecr.io/auth token service:latest | cut-d=-f1 | sed-e“s/^.*-/”`

不熟悉标记的格式,但如果我理解正确,您只需要斜杠后冒号前的部分

echo my auth token service=xxx.azurecr.io/auth token service:latest | sed-e的/^.\+\/\([^\/]\+\):[^::\+$/\1/'

不熟悉标记的格式,但如果我理解正确,您只需要斜杠后冒号前的部分

echo my auth token service=xxx.azurecr.io/auth token service:latest | sed-e的/^.\+\/\([^\/]\+\):[^::\+$/\1/'
获取介于“=”和“/”之间的文本

sed“s/*=\(.*\)\/./\1/”
=xxx.azurecr.io

获取介于“/”和“:”之间的文本

sed“s/*\/\(.*\):.*/\1/”
=auth令牌服务

获取“:”之后的文本

sed“s/*:\(.*)/\1/”
=最新版本

获取介于“=”和“/”之间的文本

sed“s/*=\(.*\)\/./\1/”
=xxx.azurecr.io

获取介于“/”和“:”之间的文本

sed“s/*\/\(.*\):.*/\1/”
=auth令牌服务

获取“:”之后的文本


sed“s/*:\(.*)/\1/”
=latest

Unix shell内置了参数扩展。您不能嵌套这些,因此需要多个步骤,但可以避免启动多个外部进程的开销

var='my-auth-token-service=xxx.azurecr.io/auth-token-service:latest'
chartname=${var%%=*}
chartname=${chartname#*-}
后缀运算符
${var%pattern}
返回
$var
的值,并删除与
pattern
匹配的任何后缀;
${var#pattern}
操作符对前缀匹配执行相同的操作。将操作符加倍会将其更改为修剪尽可能长的模式匹配,而不是最短的模式匹配。(这些是shell全局模式,而不是正则表达式。)

如果需要单行程序,可以将
cut
重构为
sed
脚本

chartname=$(sed 's/[^-]*\([^=]*\)=.*/\1/' <<< 'my-auth-token-service=xxx.azurecr.io/auth-token-service:latest')

chartname=$(sed's/[^-]*\([^=]*\)=.*/\1/')Unix shell内置了参数扩展。您无法嵌套这些参数,因此需要执行多个步骤,但可以避免启动多个外部进程的开销

var='my-auth-token-service=xxx.azurecr.io/auth-token-service:latest'
chartname=${var%%=*}
chartname=${chartname#*-}
后缀运算符
${var%pattern}
返回
$var
的值,并删除与
pattern
匹配的任何后缀;
${var#pattern}
运算符对前缀匹配执行相同的操作。将运算符加倍可将其更改为修剪尽可能长的模式匹配,而不是最短的模式匹配。(这些是shell全局模式,而不是正则表达式。)

如果需要单行程序,可以将
cut
重构为
sed
脚本

chartname=$(sed 's/[^-]*\([^=]*\)=.*/\1/' <<< 'my-auth-token-service=xxx.azurecr.io/auth-token-service:latest')

chartname=$(sed's/[^-]*\([^=]*\)=.*/\1/'因为您需要正则表达式解决方案:

string=my-auth-token-service=xxx.azurecr.io/auth-token-service:latest
[[ $string =~ /([^:]*) ]] && chartname=${BASH_REMATCH[1]}

这假设chartname始终介于
/
之间。请注意,如果正则表达式不匹配,则将取消分配
chartname

因为您要求使用正则表达式解决方案:

string=my-auth-token-service=xxx.azurecr.io/auth-token-service:latest
[[ $string =~ /([^:]*) ]] && chartname=${BASH_REMATCH[1]}

这假设chartname始终介于
/
之间。请注意,如果reges不匹配,则
chartname
将与此一起取消分配。

awk
仅在GNU变体上测试

var=my-auth-token-service=xxx.azurecr.io/auth-token-service:latest
echo“$var”| awk-F'[=:/]'-vOFS='\n'{print$1、$2、$3、$NF}”
输出

my-auth-token-service
xxx.azurecr.io
auth-token-service
latest

使用
awk
仅在GNU变型上测试

var=my-auth-token-service=xxx.azurecr.io/auth-token-service:latest
echo“$var”| awk-F'[=:/]'-vOFS='\n'{print$1、$2、$3、$NF}”
输出

my-auth-token-service
xxx.azurecr.io
auth-token-service
latest

你能确切地说明你想在这里提取什么吗?我想得到chartname应该打印身份验证令牌服务它不清楚这种方法有什么问题。我不觉得这更好,但你可以试试
sed“s/*\/\(.\):./\1/”
如果您只想sed,我希望非常干净,比如使用sed而不是像cut然后是sed。原因是可读性不强。我正在循环中运行,希望获得chartname、reponame和tagName。$I值为“lsr auth token service=xxx.azurecr.io/auth token service:latest”chartName=auth-token-service-reponame=xxx.azurecr.io标记名=latest-chartName=
echo$i | cut-d=-f1 | sed-e“s/^.*-/”
repoName=
echo$i | cut-d=-f2 | cut-d/-f2 | cut-d:-f1
tagName=
echo$i | cut-d=-f2 | cut-d/-f2 | cut-d:-f2
你能确切地说明你在这里想要提取什么吗?我想得到的是chartname应该打印身份令牌服务它不清楚这种方法有什么问题。我不觉得这样更好,但您可以尝试
sed“s/*\/\(.*\):.*/\1/”
如果您只想sed,我希望非常干净,像sed一样使用,而不是像cut和sed一样使用。原因是可读性不强。我在循环中运行,希望获得chartname、reponame和标记名。$I值是“lsr auth-token-service=xxx.azurecr.io/auth-token-service:latest”chartName=auth token service reponame=xxx.azurecr.io tagname=latest chartName=
echo$i | cut-d=-f1 | sed-e/s.*/“
reponame=
echo$i | cut-d=-f2 | cut d/-f2 | cut d:-f1
标记名=
echo$i | cut regd=-f2 | cut d/-f2 | cut d:-f2“auth token service”@Kelvin更好。你能帮我获取reponame和tag吗?Repo name应该返回“xxx.azurecr.io”,tag应该返回“latest”,我想提取chartname,而值应该由regex“auth token service”@Kelvin返回。你能帮我获取reponame和tag吗?Repo name应该返回