Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 搜索字符串的正则表达式_Regex_Bash - Fatal编程技术网

Regex 搜索字符串的正则表达式

Regex 搜索字符串的正则表达式,regex,bash,Regex,Bash,命令 grep-rcmake\u C\u COMPILER\u 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.di

命令
grep-rcmake\u C\u COMPILER\u 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脚本中使用


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

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

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

这将返回
CMAKE\u C\u COMPILER\u ID

后引号内的字符串。假设
grep
支持,您可以说:

grep -oPr 'CMAKE_C_COMPILER_ID "\K[^"]*'
这将在
CMAKE\u C\u COMPILER\u ID

之后返回引号内的字符串。还有一种方法:

awk '/CMAKE_C_COMPILER_ID / && sub(/\)$/,"",$NF) && $0=$NF' inputFile
我们告诉awk:

  • 通过在
    /../
  • 如果找到,使用
    sub
    功能放弃
  • 如果成功,则打印最后一个字段
gnu sed
: 使用
sed

  • 我们在找符合你的式样的线
  • 使用捕获的组
    (..)
    抓取所有内容直到
  • 使用背面参照打印
    \1
  • -n
    禁用默认打印
  • p
    允许在成功的行上打印
  • r
    允许我们使
    sed
    更具可读性。如果不支持
    -r
    ,则可以使用
    -E
    • 还有另一种方法:

      awk '/CMAKE_C_COMPILER_ID / && sub(/\)$/,"",$NF) && $0=$NF' inputFile
      
      我们告诉awk:

      • 通过在
        /../
      • 如果找到,使用
        sub
        功能放弃
      • 如果成功,则打印最后一个字段
      gnu sed
      : 使用
      sed

      • 我们在找符合你的式样的线
      • 使用捕获的组
        (..)
        抓取所有内容直到
      • 使用背面参照打印
        \1
      • -n
        禁用默认打印
      • p
        允许在成功的行上打印
      • r
        允许我们使
        sed
        更具可读性。如果不支持
        -r
        ,则可以使用
        -E

      您想要包含GNU的字符串吗?不,输出应该是GNU(或CMAKE_C_编译器ID设置的任何其他编译器名称),因此您想要在CMAKE_C_编译器ID之后写入文本您想要包含GNU的字符串吗?不,输出应该是GNU(或CMAKE_C_编译器ID设置的任何其他编译器名称)所以你想要在CMAKE_C_编译器_idd之后写文本,谢谢。这很接近我想要的。如何使grep不显示文件名,以及如何确保我只首先获得1(或第一个)?@ankeshana如果您只想要第一个结果,请将结果传送到
      head
      (特别是传送到
      head-1
      )。如果您不想要文件名,可以说
      grep-oPh'CMAKE_C_COMPILER_ID“\K[^”]*”*| head-1
      。这样做很有效,而且一切都有意义。谢谢你的帮助。您还可以给我指一个资源,让我更深入地了解这一点。对于不支持PCRE的系统,是否有其他解决方案?@Ankeshana并查看
      grep
      文档:
      info grep
      。另外请查看答案中提供的链接。谢谢。这很接近我想要的。如何使grep不显示文件名,以及如何确保我只首先获得1(或第一个)?@ankeshana如果您只想要第一个结果,请将结果传送到
      head
      (特别是传送到
      head-1
      )。如果您不想要文件名,可以说
      grep-oPh'CMAKE_C_COMPILER_ID“\K[^”]*”*| head-1
      。这样做很有效,而且一切都有意义。谢谢你的帮助。您还可以给我指一个资源,让我更深入地了解这一点。对于不支持PCRE的系统,是否有其他解决方案?@Ankeshana并查看
      grep
      文档:
      info grep
      。另请查看答案中提供的链接。@Ankeshana并添加了一个
      sed
      选项。回报你的支持<代码>:)@ankeshana并添加了一个
      sed
      选项。回报你的支持<代码>:)