【问题标题】:Extract version using grep/regex in bash在 bash 中使用 grep/regex 提取版本
【发布时间】:2017-09-24 10:26:12
【问题描述】:

我有一个文件有一行说明

version = "12.0.08-SNAPSHOT"

单词version 和带引号的字符串可以出现在该文件的多行中。

我正在寻找可以输出以下字符串的单行bash语句:

12.0.08-SNAPSHOT

版本也可以有RELEASE标签而不是SNAPSHOT。

总结一下,给定

version = "12.0.08-SNAPSHOT"
expected output: 12.0.08-SNAPSHOT

给定

version = "12.0.08-RELEASE"
expected output: 12.0.08-RELEASE

【问题讨论】:

  • 那么你在苦苦挣扎,看不到任何代码?

标签: regex bash grep


【解决方案1】:

以下命令打印 version = "..." 中引用的字符串:

grep -Po '\bversion\s*=\s*"\K.*?(?=")' yourFile

-P 启用 perl 正则表达式,这允许我们使用 \K 等功能。
-o 仅打印匹配的部分而不是整行。

\b 确保 version 从单词边界开始,我们不匹配像 abcversion 这样的东西。
\s 代表任何类型的空格。
\Kgrep忘了,它与\K 之前的部分匹配。忘记的部分不会被打印。
.*? 匹配尽可能少的字符(匹配的部分将被打印)...
(?=") ...直到我们看到",它赢了' 也不包含在匹配中(这称为前瞻)。

并非所有grep 实现都支持-P 选项。或者,您可以使用perl,如this answer 中所述:

perl -nle 'print $& if m{\bversion\s*=\s*"\K.*?(?=")}' yourFile

【讨论】:

  • grep -P 与 GNU grep 一起工作(大多数版本无论如何),但它不是可移植的。 OP 没有指定正在使用什么操作系统,所以如果它是特定于平台的,那么确定你的答案很重要。或者更好的是,制作一个便携的答案。
  • 非常好的答案!
【解决方案2】:

似乎是cut 的工作:

$ echo 'version = "12.0.08-SNAPSHOT"' | cut -d'"' -f2
12.0.08-SNAPSHOT

$ echo 'version = "12.0.08-RELEASE"' | cut -d'"' -f2
12.0.08-RELEASE

【讨论】:

    【解决方案3】:

    便携式解决方案:

    $ echo 'version = "12.0.08-RELEASE"' |sed -E 's/.*"(.*)"/\1/g'
    12.0.08-RELEASE
    

    甚至:

    $ perl -pe 's/.*"(.*)"/\1/g'.
    $ awk -F"\"" '{print $2}'
    

    【讨论】:

      猜你喜欢
      • 2017-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多