在bash中使用正则表达式查找文件中的字符串

时间:2018-07-12 12:00:35

标签: regex bash

我有一堆文件,其中使用了模板标签。我想列出所有文件中使用的所有不同模板标签。

这是我用过的bash脚本,没有匹配项...

for f in EHS/*.html;  do
  value=`cat ${f}`;
  [[ $value =~ "({%.*?%})" ]]
  if [[ ${BASH_REMATCH[0]} ]]; then
    echo "Found: ${BASH_REMATCH[0]}";
  fi
done;

这是其中一个html文件的摘录:

<p>
  The ordernumber is: {%OrderNumber%}<br>
  The partnumer is: {%PartNumber%}
</p>

所以我的目标是只返回使用的所有不同标签...

1 个答案:

答案 0 :(得分:3)

两个问题:

  1. 该正则表达式应该不加引号,但是{}需要转义,因为它们的含义很特殊。

  2. bash不支持像*?这样的节俭量词。

使用grep更容易:

grep -o '{%[^}]*%}'

-o选项仅返回匹配的部分,每行一个。

请注意,{%ab%cd}ef%}之类的字符串不匹配,因为没有简单的方法来防止标准grep中多字符定界符的出现。使用pgrep,您可以使用

grep -o -P '{%.*?%}'

与您最初的意图一样。