如何grep单引号之间的所有内容?

Ami*_*n Z 1 bash grep sed

我无法弄清楚如何 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" 我也喜欢删除我编辑为 .x 的 8.x- sed -n "s#version:\s*'8.x-\(.*\)'#\1#p"

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

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

kva*_*our 5

如果您只想从文件中获得该信息,并且只能快速执行以下操作:

awk -F"'" '/version/{print $2}' file
Run Code Online (Sandbox Code Playgroud)

例子:

$ echo "version: '8.x-1.0-alpha1'" | awk -F"'" '/version/{print $2}'
8.x-1.0-alpha1
Run Code Online (Sandbox Code Playgroud)

这是如何运作的?

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

condition { action }
condition { action }
...
Run Code Online (Sandbox Code Playgroud)

wherecondition通常是一个表达式和action一系列命令。

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

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

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

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

现在有几件事可以做。

  1. 提高condition/^version :/ && NF==3读取_IF与子当前行开始version : 当前行有3个字段,然后做action

  2. 如果您只想要第一次出现,您可以exit通过将操作更新为在查找后立即告诉系统{print $2; exit}


gle*_*man 5

我将 GNU grep 与 pcre 正则表达式一起使用:

grep -oP "version: '\\K.*(?=')" file
Run Code Online (Sandbox Code Playgroud)

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