存储数组中正则表达式的匹配结果

时间:2016-03-04 20:08:32

标签: arrays regex bash

我正在尝试编写一个简单的bash脚本,该脚本将grep二进制文件中的字符串,然后使用正则表达式提取所有十六进制字符串。但是,我似乎无法找到一种方法,我可以将正则表达式的输出存储在一个数组中,以后我可以将其所有元素从十六进制转换为ASCII值。

str=$(grep -ra "Html.Exploit.CVE.2015_6073" /var/lib);
hexstr=$([[ $STR =~ (?<=^|[*{};])[A-Fa-f0-9]+(?=$|[*;{}]) ]]);
converted=$(xxd -r -p <<< "$HEXSTR");
echo -e "\e[92m$converted \e[0m"

我可以在if语句中使用while循环创建一个包含十六进制字符串(从正则表达式返回)作为元素的数组吗?

更新

当前代码:

#!/bin/bash

str=$(grep -ra "Html.Exploit.CVE.2015_6073" /var/lib);

 if [[ $str =~ (?<=^|[*{};])[A-Fa-f0-9]+(?=$|[*;{}]) ]]; then
      Array+="$str"
 fi

 for hex in "${Array[@]}"; do 
      echo $hex
 done

1 个答案:

答案 0 :(得分:3)

您可以在bash中为数组添加值:

 Array+=("$hexstr")

然后你可以像这样遍历数组:

 for hex in "${Array[@]}"; do 
      #perform operation to convert hex here
      converted="$(xxd -r -p <<< "$hex")"
 done

要纠正if match逻辑,您可以这样做一个语句,以便设置$hexstr变量。

 if [[ $STR =~ (?<=^|[*{};])[A-Fa-f0-9]+(?=$|[*;{}]) ]]; then
      hexstr="$STR"
 fi

将它们放在一起看起来像这样:

 if [[ $STR =~ (?<=^|[*{};])[A-Fa-f0-9]+(?=$|[*;{}]) ]]; then
      Array+=("$STR")
 fi

 ###Do work
 ###Use For loop etc

如果你想进一步缩短你的代码(减少代码破坏的机会),你可以在grep中完成所有匹配并添加到数组中:

 Array=($( grep -ra "Html.Exploit.CVE.2015_6073" /var/lib | grep -oP "(?<=^|[*{};])[A-Fa-f0-9]+(?=$|[*;{}])"))
 ##Do For loop

上面将执行你的grep并找到匹配的行,然后它只获得正则表达式的匹配值并将每个存储在数组中。