regex 在sed语句中组合多个正则表达式

ovfsdjhp  于 2022-11-18  发布在  其他
关注(0)|答案(4)|浏览(157)

我想知道docker-compose的版本号。每个版本的格式不同。
例如:运行docker-compose --version

docker-compose version 1.29.2, build someId
Docker Compose version v2.12.2

我有单独的sed语句来获取版本号,但如果可能的话,我希望将它们组合在一起。

echo `docker-compose --version` | sed -nr 's|^docker-compose version (.*)(,.*)|\1|p'
echo `docker-compose --version` | sed -nr 's|^Docker compose version v(.*)|\1|p'

如果I或两个正则表达式一起使用管道,则引用需要更改为\1或\3,这取决于它被捕获的位置。
有没有更好的方法来使用sed?

ecbunoof

ecbunoof1#

您可以使用这个单一的sed,从问题中显示的两行取得版本号码:

sed -E 's/^[dD]ocker[- ][cC]ompose version +v?([^,]+).*/\1/'

1.29.2
2.12.2

明细:

  • ^:开始
  • [dD]ocker[- ][cC]ompose version:匹配具有大小写混合字母和连字符/空格分隔符的起始字符串
  • +v?:匹配1+个空格,后跟可选的v
  • ([^,]+):匹配1+个非逗号的任何字符,并在组#1中捕获
  • .*:匹配所有内容,直到结束
  • \1:对捕获组#1的反向引用
m3eecexj

m3eecexj2#

Bash有内置的regex支持([[ $string =~ $regex ]]将match组的内容存储在数组BASH_REMATCH中),所以这里不需要sed。下面的代码更详细,但运行起来更快,因为不需要启动任何外部可执行文件:

dockerComposeVersion=$(docker-compose --version)
dcVersionRegex='[Dd]ocker[ -]compose version v?([^,]+)'

if [[ $dockerComposeVersion =~ $dcVersionRegex ]]; then
  echo "docker-compose version is ${BASH_REMATCH[1]}"
else
  echo "Unable to get docker-compose version" >&2
fi
drkbr07n

drkbr07n3#

您可以将两个表达式合并为

echo `docker-compose --version` | sed -nr 's|^[dD]ocker[ -][cC]ompose version v?([^, ]*).*|\1|p'
  • 详细数据 *:
  • ^-字符串开始
  • [dD]-dD
  • ocker-文字字符串
  • [ -]-空格或连字符
  • [cC]-cC
  • ompose version-固定字符串
  • v?-可选的v字符
  • ([^, ]*)-组1:零个或多个除空格和逗号以外的字符
  • .*-字符串的其余部分。
nbysray5

nbysray54#

在GNU awk中,请尝试以下awk代码。使用GNU awk中的match函数和正则表达式^([dD]ocker(-c| C)ompose version )v?(([0-9]+\.){2}[0-9]+),?来获得所需的值。如果找到任何匹配,则将其存储到名为arr的数组中,并打印arr的元素1st和3rd。

awk '
match($0,/^([dD]ocker(-c| C)ompose version )v?(([0-9]+\.){2}[0-9]+),?/,arr){
  print arr[1] arr[3]
}
'  Input_file

相关问题