【问题标题】:I get a blank echo from regex我从正则表达式中得到一个空白回声
【发布时间】:2018-09-10 08:48:17
【问题描述】:

如果我运行这个文件,它可以正常工作并输出我期望的行:

workspaceFile=`cat tensorflow/workspace.bzl`
echo $workspaceFile | grep -oP '\/[a-z0-9]{12}.tar.gz'

但是,如果我运行它,我得到的只是终端中的空白输出:

workspaceFile=`cat tensorflow/workspace.bzl`
TAR_FILE_WITH_SLASH=$workspaceFile | grep -oP '\/[a-z0-9]{12}.tar.gz'
echo $TAR_FILE_WITH_SLASH

该文件很长,所以为了简单起见,我将在此处添加一个缩短版本:

tf_http_archive(
  name = "eigen_archive",
  urls = [
    "https://mirror.bazel.build/bitbucket.org/eigen/eigen/get/6913f0cf7d06.tar.gz",
    "https://bitbucket.org/eigen/eigen/get/6913f0cf7d06.tar.gz",
  ],

【问题讨论】:

  • 使用TAR_FILE_WITH_SLASH="$(echo $workspaceFile | grep -oP '/[a-z0-9]{12}\.tar\.gz')"

标签: regex string bash echo


【解决方案1】:

您需要使用$() 语法,回显workspaceFile 的内容,然后通过管道传递grep 命令:

TAR_FILE_WITH_SLASH="$(echo $workspaceFile | grep -oE '/[a-z0-9]{12}\.tar\.gz')"

另外,请注意这里不需要 PCRE 正则表达式,您可以使用 POSIX ERE 正则表达式(即,将 P 替换为 E)。您甚至可以在这里使用 POSIX BRE 模式,例如 grep -o '/[a-z0-9]\{12\}\.tar\.gz'。点必须转义以匹配文字点,/ 在这里并不特殊,不需要转义。

请参阅online demo

【讨论】:

  • 我知道这是一个额外的问题,但最终的、所需的输出将只有 1 并删除了前导“/”?
  • 你的意思是你想摆脱/?使用grep -oP '/\K[a-z0-9]{12}\.tar\.gz'
  • 是的,并且只匹配第一次出现的正则表达式(在这个特定的例子中有 2 个)。
  • 非常感谢!伙计,我很想知道你的正则表达式知识:)
【解决方案2】:

路径是什么?

workspaceFile=`cat ~/tensorflow/workspace.bzl`

【讨论】:

    猜你喜欢
    • 2013-07-26
    • 2016-02-29
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    相关资源
    最近更新 更多