我有一个用于审核的命令列表,类似于:
1. -a *policy name=PolicyName -a *policy workflow name=PolicyWorkflow -a *policy action name=PolicyAction -s Server -b Storage -J Node -y 1 Months -o -F -S
2. -a *policy name=PolicyName -a *policy workflow name=PolicyWorkflow -a *policy action name=PolicyAction -s Server -b Storage -J Node -y 1 Months -o -F -S
3. -a *policy name=Policy Name -a *policy workflow name=PolicyWorkflow -a *policy action name=PolicyAction -s Server -b Storage -J Node -y 1 Months -o -F -S
我正在尝试将每个name=Value
变量设置为。由于这是标准模式,我成功地使用了 read,但是当我到达带有空格的行(参见第 3 行)时,它会偏移我的所有变量。我不确定如何在不循环遍历行中的每个单词并匹配特定模式的情况下解决这个问题。希望有人能有更好的解决方案。
答案1
在bash
并使用数组变量时,您可以执行以下操作:
{ IFS=$'\n'; array=($(grep -Po 'name=[^-]+(?=\s*-)' infile)); }
然后打印数组的元素(bash中的数组索引从0开始):
printf '%s\n' "${array[@]}"
name=PolicyName
name=PolicyWorkflow
name=PolicyAction
name=PolicyName
name=PolicyWorkflow
name=PolicyAction
name=Policy Name
name=PolicyWorkflow
name=PolicyAction
或者只打印单个元素:
printf '%s\n' "${array[6]}"
name=Policy Name
我们定义
IFS
到“\n
ewline”字符IFS=$'\n'
,以便单词拆分\n
仅在结果上发生在“ ewline”字符上未引用的–命令替换$(...)
。语法是已知的
{ list; }
分组命令我只是习惯对我的命令进行分组。该
array=(...)
语法用于创建关联的大批变量名为array
.使用
grep -Po 'name=[^-]+(?=\s*-)' infile
,我们-o
只打印与模式匹配的匹配项"name="
后跟任何非零长度的字符,但连字符[^-]+
后跟零个或多个空格,直到连字符(?=\s*-)
。- 语法
(?=...)
是正向前瞻通过 grep 的-P
选项,它可以用来将模式解释为Perl 兼容正则表达式 (PCRE)。
- 语法
未来阅读: