我无法弄清楚如何 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"
如果您只想从文件中获得该信息,并且只能快速执行以下操作:
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一系列命令。
-F "'":这里我们告诉awk将字段分隔符定义FS为 <single quote> '。这意味着所有行将被拆分为字段$1, $2, ... ,$NF并且每个字段之间有一个'. 我们现在可以通过使用$1第一个字段,$2第二个......等等来引用这些字段,直到$NFwhereNF是每行的字段总数。
/version/{print $2}:这是条件-动作对。
条件:/version/:: 条件读取:如果当前记录/行中的子字符串与正则表达式匹配,则/version/执行action。在这里,这被简单地翻译为好像当前行包含一个子字符串version
action: {print $2}:: 如果满足前面的条件,则打印第二个字段。在这种情况下,第二个字段将是 OP 请求的字段。
现在有几件事可以做。
提高condition是/^version :/ && NF==3读取_IF与子当前行开始version : 与当前行有3个字段,然后做action
如果您只想要第一次出现,您可以exit通过将操作更新为在查找后立即告诉系统{print $2; exit}
我将 GNU grep 与 pcre 正则表达式一起使用:
grep -oP "version: '\\K.*(?=')" file
Run Code Online (Sandbox Code Playgroud)
我们正在寻找“version: '”,然后\K指令将忘记它刚刚看到的内容,只.*(?=')匹配最后一个单引号。