我目前正在使用这个单行代码来获取最新发行版本的docker-compose
.
curl --silent "https://api.github.com/repos/docker/compose/releases/latest" | grep "tag_name" | sed -E 's/.*"([^"]+)".*/\1/'
这不是我的代码。我复制并粘贴了它,它起作用了,我想了解更多信息。具体来说,我对这个命令很感兴趣sed
。谁能帮助我更好地理解它?
sed -E 's/.*"([^"]+)".*/\1/'
基本上我不理解任何字符串。我单独知道这些项目(.*
= 任何一个或多个字符,[^"]
= 接受任何不认识的内容"
)。但当它以这种方式写出来时,我不确定它是如何运作的。
没有命令的命令输出sed
:"tag_name": "1.22.0",
命令的输出sed
:1.22.0
答案1
sed -E 's/.*"([^"]+)".*/\1/
-E
:sed
将使用扩展正则表达式- 's':替换值。
/
:将使用的模式和替换的分隔符。.*"([^"]+)".*
:我知道解释正则表达式的最好方法是一张图:
基本上,它匹配具有两个引号块的每一行,并将第二个引号(不带引号)放在第一组内。/
: 正则表达式和替换表达式之间的分隔符\1
1.22.0
:在本例中,将原始行替换为组号 1 : 。/
:最后一个分隔符后面没有选项,因此每行仅替换一次。
希望这能解释得足够好。
如果您需要以更直观的方式阅读正则表达式,您可以使用网站正则表达式这太棒了。
答案2
我不知道你知道什么sed
。在sed(1)你可能会发现:
sed——用于过滤和转换文本的流编辑器
和:
-E
,-r
,--regexp-extended
在脚本中使用扩展正则表达式(为了可移植性,使用 POSIX
-E
)。
你sed
可以定义,让我说,字型括号之间,您可以用\
(反斜杠)后跟一位数字来替换它们。在你的问题中,让我写如下:
echo '"tag_name": "1.22.0"' | sed -E 's/"([a-z]+\_[a-z]+)": "([0-9\.]+)"/\2/'
-E
使用扩展正则表达式's/Part1/Part2/
主要结构"
正则表达式模式开头为"
([a-z]+\_[a-z]+)
第一的字型包含两部分字符连接_
": "
之后这些序列符号就会出现([0-9\.]+)
第二字型包含一位或多位数字.
"
模式以其结束。\2
现在你打电话给第二个字型