使用扩展 RegExp 理解 Sed 命令

使用扩展 RegExp 理解 Sed 命令

我目前正在使用这个单行代码来获取最新发行版本的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",

命令的输出sed1.22.0

答案1

sed -E 's/.*"([^"]+)".*/\1/

  • -Esed将使用扩展正则表达式
  • 's':替换值。
  • /:将使用的模式和替换的分隔符。
  • .*"([^"]+)".*:我知道解释正则表达式的最好方法是一张图:
    正则表达式移植
    基本上,它匹配具有两个引号块的每一行,并将第二个引号(不带引号)放在第一组内。
  • /: 正则表达式和替换表达式之间的分隔符
  • \11.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现在你打电话给第二个字型

相关内容