搜索字符串的正则表达式

时间:2014-03-14 05:27:48

标签: regex bash

命令     grep -r CMAKE_C_COMPILER_ID给出了以下输出:

printtimestamp.dir/DependInfo.cmake:SET(CMAKE_C_COMPILER_ID "GNU")
2.8.10.1/CMakeCCompiler.cmake:set(CMAKE_C_COMPILER_ID "GNU")
2.8.10.1/CMakeCCompiler.cmake:set(CMAKE_C_COMPILER_ID_RUN 1)
buildtimestart.dir/DependInfo.cmake:SET(CMAKE_C_COMPILER_ID "GNU")
buildtimeend.dir/DependInfo.cmake:SET(CMAKE_C_COMPILER_ID "GNU")

我想从中提取字符串GNU(注意,字符串可能不是GNU总是,它可能是其他编译器,如CYGWIN)。我可以使用grep来实现这个的正则表达式是什么?任何其他等效的解决方案也没关系。这将在bash脚本中使用。

如果问题太具体,我很抱歉,我不知道如何构建它。

2 个答案:

答案 0 :(得分:2)

假设您的grep支持PCRE,您可以说:

grep -oPr 'CMAKE_C_COMPILER_ID "\K[^"]*'

这会在CMAKE_C_COMPILER_ID之后的引号内返回字符串。

答案 1 :(得分:2)

这是另一种方式:

awk '/CMAKE_C_COMPILER_ID / && sub(/\)$/,"",$NF) && $0=$NF' inputFile

我们告诉awk:

  • 通过在regex
  • 中说明模式,查找与/../匹配的行
  • 如果找到,请使用sub功能放弃)
  • 如果成功,请打印最后一个字段

gnu sed

sed -nr 's/.*CMAKE_C_COMPILER_ID ([^)]+)\)$/\1/p' inputFile

使用sed

  • 我们会查找您的模式
  • 使用捕获的群组(..)抓取所有内容)
  • 使用反向引用\1
  • 进行打印
  • -n禁用默认打印
  • p可以在成功的行上打印
  • r可让我们提高sed的可读性。如果不支持-r,您可以使用-E