带有来自变量的正则表达式的 awk 命令失败
awk command with regex expression from variable fails
我正在尝试根据特定模式从数组中获取元素
例如:
alllist 是包含以下数据的数组:
echo "${alllist[@]}":
setup-demo1-release-0 setup-demo1-release-1 setup-demo1-release-2 setup-demo1-production-0 setup-demo1-production-1
其中 type 是一个变量,可以有像 -release-0 和 -production-0 这样的值,以 [=30= 结尾]连字符和数字
setup-demo1 对于数组中的所有元素都是相同的,<-release-0> 和 <-生产-0>
所以创建了一个正则表达式,它将在其中查找如下内容:
对于 type=release 它应该 return 所有值
setup-demo1-release-0 setup-demo1-release-1
对于 type=production 它应该 return 所有值
setup-demo1-production-0 setup-demo1-production-1
注意:setup-demo1也可以写成setup-release1或setup-production1,所以用grep来忽略这些词。
我也试过通过 awk 命令实现这个:
endWithDigitPattern='[-0-9]'
targetNodes=($(echo "$alllist"| sed 's/[][",]//g' | tr ' ' '\n' | awk -v nTypes="release""$endWithDigitPattern" '~ nTypes {print }'))
并且在通过脚本文件执行时未达到预期结果 return。
可能是我没有以正确的方式使用 endWithDigitPattern 变量。
让我知道我使用的命令有什么问题。
设置:
$ alllist=(setup-demo1-release-0 setup-demo1-release-1 setup-demo1-release-2 setup-demo1-production-0 setup-demo1-production-1)
$ endWithDigitPattern='[-0-9]'
echo "$alllist"
等同于echo "${alllist[0]}"
;要显示数组的全部内容,我们需要使用 echo "${alllist[@]}"
(请记住,如果数组值包含白色 space,这将无法按预期工作),例如:
$ typeset -p alllist
declare -a alllist=([0]="setup-demo1-release-0" [1]="setup-demo1-release-1" [2]="setup-demo1-release-2" [3]="setup-demo1-production-0" [4]="setup-demo1-production-1")
$ echo "$alllist" # references alllist[0]
setup-demo1-release-0
$ echo "${alllist[@]}"
setup-demo1-release-0 setup-demo1-release-1 setup-demo1-release-2 setup-demo1-production-0 setup-demo1-production-1
OP的当前代码:
$ echo "$alllist"| sed 's/[][",]//g' | tr ' ' '\n' | awk -v nTypes="release""$endWithDigitPattern" '~ nTypes {print }'
setup-demo1-release-0
修复到 OP 的当前代码:
$ echo "${alllist[@]}"| sed 's/[][",]//g' |tr ' ' '\n' | awk -v nTypes="release""$endWithDigitPattern" '~ nTypes {print }'
setup-demo1-release-0
setup-demo1-release-1
setup-demo1-release-2
假设我们可以忽略数组值中白色 space 的可能性,还有一些其他方法可以执行所需的操作;一个想法使用 printf|grep
:
$ type=production
$ printf "%s\n" "${alllist[@]}" | grep -- "-${type}-[0-9]"
setup-demo1-production-0
setup-demo1-production-1
$ type=release
$ printf "%s\n" "${alllist[@]}" | grep -- "-${type}-[0-9]"
setup-demo1-release-0
setup-demo1-release-1
setup-demo1-release-2
我正在尝试根据特定模式从数组中获取元素 例如: alllist 是包含以下数据的数组:
echo "${alllist[@]}":
setup-demo1-release-0 setup-demo1-release-1 setup-demo1-release-2 setup-demo1-production-0 setup-demo1-production-1
其中 type 是一个变量,可以有像 -release-0 和 -production-0 这样的值,以 [=30= 结尾]连字符和数字
setup-demo1 对于数组中的所有元素都是相同的,<-release-0> 和 <-生产-0> 所以创建了一个正则表达式,它将在其中查找如下内容: 对于 type=release 它应该 return 所有值
setup-demo1-release-0 setup-demo1-release-1
对于 type=production 它应该 return 所有值
setup-demo1-production-0 setup-demo1-production-1
注意:setup-demo1也可以写成setup-release1或setup-production1,所以用grep来忽略这些词。
我也试过通过 awk 命令实现这个:
endWithDigitPattern='[-0-9]'
targetNodes=($(echo "$alllist"| sed 's/[][",]//g' | tr ' ' '\n' | awk -v nTypes="release""$endWithDigitPattern" '~ nTypes {print }'))
并且在通过脚本文件执行时未达到预期结果 return。 可能是我没有以正确的方式使用 endWithDigitPattern 变量。
让我知道我使用的命令有什么问题。
设置:
$ alllist=(setup-demo1-release-0 setup-demo1-release-1 setup-demo1-release-2 setup-demo1-production-0 setup-demo1-production-1)
$ endWithDigitPattern='[-0-9]'
echo "$alllist"
等同于echo "${alllist[0]}"
;要显示数组的全部内容,我们需要使用 echo "${alllist[@]}"
(请记住,如果数组值包含白色 space,这将无法按预期工作),例如:
$ typeset -p alllist
declare -a alllist=([0]="setup-demo1-release-0" [1]="setup-demo1-release-1" [2]="setup-demo1-release-2" [3]="setup-demo1-production-0" [4]="setup-demo1-production-1")
$ echo "$alllist" # references alllist[0]
setup-demo1-release-0
$ echo "${alllist[@]}"
setup-demo1-release-0 setup-demo1-release-1 setup-demo1-release-2 setup-demo1-production-0 setup-demo1-production-1
OP的当前代码:
$ echo "$alllist"| sed 's/[][",]//g' | tr ' ' '\n' | awk -v nTypes="release""$endWithDigitPattern" '~ nTypes {print }'
setup-demo1-release-0
修复到 OP 的当前代码:
$ echo "${alllist[@]}"| sed 's/[][",]//g' |tr ' ' '\n' | awk -v nTypes="release""$endWithDigitPattern" '~ nTypes {print }'
setup-demo1-release-0
setup-demo1-release-1
setup-demo1-release-2
假设我们可以忽略数组值中白色 space 的可能性,还有一些其他方法可以执行所需的操作;一个想法使用 printf|grep
:
$ type=production
$ printf "%s\n" "${alllist[@]}" | grep -- "-${type}-[0-9]"
setup-demo1-production-0
setup-demo1-production-1
$ type=release
$ printf "%s\n" "${alllist[@]}" | grep -- "-${type}-[0-9]"
setup-demo1-release-0
setup-demo1-release-1
setup-demo1-release-2