【问题标题】:how to grep everything between single quotes?如何grep单引号之间的所有内容?
【发布时间】:2018-10-09 14:20:22
【问题描述】:

我无法弄清楚如何 grep 两个单引号之间的字符。

我在一个文件里有这个 version: '8.x-1.0-alpha1'

我喜欢这样的输出(版本号可以是不同的):

8.x-1.0-alpha1

我写了以下,但它不起作用:

cat myfile.txt | grep -e 'version' | sed 's/.*\?'\(.*?\)'.*//g'

感谢您的帮助。

补充: 我使用了 sed 命令sed -n "s#version:\s*'\(.*\)'#\1#p" 我还想删除 8.x- 我编辑到 sed -n "s#version:\s*'8.x-\(.*\)'#\1#p"

此命令仅适用于 linux,不适用于 MAC。如何更改此命令以使其在 MAC 上运行?

sed -n "s#version:\s*'8.x-\(.*\)'#\1#p"

【问题讨论】:

标签: bash sed grep


【解决方案1】:

如果您只想从文件中获取该信息,并且您可以快速做到这一点:

awk -F"'" '/version/{print $2}' file

例子:

$ echo "version: '8.x-1.0-alpha1'" | awk -F"'" '/version/{print $2}'
8.x-1.0-alpha1

这是如何工作的?

一个 awk 程序是一系列模式-动作对,写成:

condition { action }
condition { action }
...

其中condition 通常是一个表达式,action 是一系列命令。

  1. -F "'": 这里我们告诉 将字段分隔符FS 定义为 '。这意味着所有行将在字段$1$2、...、$NF 中拆分,并且每个字段之间有一个'。我们现在可以通过使用$1 作为第一个字段,$2 作为第二个字段来引用这些字段......等等,直到$NF,其中NF 是每行的字段总数。

  2. /version/{print $2}:这是条件-动作对。

    • 条件:/version/:: 条件为:如果当前记录/行中的子字符串匹配正则表达式/version/,则执行action。在这里,这被简单地翻译为如果当前行包含子字符串version

    • action:{print $2}::如果满足前面的条件,则打印第二个字段。在这种情况下,第二个字段将是 OP 请求的内容。

现在有几件事可以做。

    1234563 p>
  1. 如果您只想要第一次出现,您可以在找到后立即告诉系统exit,方法是将操作更新为{print $2; exit}

【讨论】:

  • 不错。为了减少误报匹配,我会使用$1 == "version: " {print $2}
【解决方案2】:

我会使用带有 pcre 正则表达式的 GNU grep:

grep -oP "version: '\\K.*(?=')" file

我们在哪里寻找“版本:'”,然后\K 指令将忘记它刚刚看到的内容,让.*(?=') 匹配最后一个单引号。

【讨论】:

    【解决方案3】:

    试试这样的:sed -n "s#version:\s*'\(.*\)'#\1#p" myfile.txt。这通过查找“版本”行并提取单引号之间的内容来避免多余的catgrep

    解释:

    -n 标志告诉 sed 不要自动打印行。然后,我们在 sed 模式末尾使用 p 命令在找到版本行时显式打印。

    搜索模式:version:\s*'\(.*\)'

    • version:\s* 匹配“版本:”,后跟任意数量的空格
    • '\(.*\)' 匹配单个',然后捕获所有内容,直到下一个'

    替换为:\1;这是上面的第一个(也是唯一一个)捕获组,包含单引号之间的内容。

    【讨论】:

    • 我尝试了这个命令(将:替换为=)如下一行:version='0.1.2',。输出为:0.1.2,,这意味着您建议的命令并不仅仅保留单引号之间的内容
    • 它打印version= 行中的所有内容,之后没有'
    • 谢谢,这可以很好地从 python 文件中获取 version 变量,例如要在 CI 中使用:sed -n "s#__version__ =\s*'\(.*\)'#\1#p" version.py 将从 version.py 中提取 0.20.9 并带有一行 __version__ = '0.20.9'
    【解决方案4】:

    当你只想看他的报价时,你可以使用cut

    grep -e 'version' myfile.txt | cut -d "'" -f2
    

    【讨论】:

      【解决方案5】:

      grep 一个人几乎可以做到这一点:

      grep -o "'.*'" file.txt
      

      但这也可能会打印您不想打印的行:它将打印所有带有 2 个单引号 (') 的行。并且输出仍然有单引号('):

      '8.x-1.0-alpha1'
      

      但是 sed 一个人就可以做到:

      sed -rn "s/^version: +'([^']+)'.*/\1/p" file.txt
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-07
        • 2011-04-09
        相关资源
        最近更新 更多