使用扩展的 RegExp 理解 Sed 命令

64H*_*4Hz 1 sed regular-expression text-formatting

我目前正在使用这个 one-liner 来获取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

Kiw*_*iwy 5

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

  • -E:sed将使用扩展正则表达式
  • 's':替换值。
  • /:将使用的模式和替换的分隔符。
  • .*"([^"]+)".*:我所知道的解释正则表达式的最好方法是图表:
    正则表达式
    基本上它匹配有两个引号块的每一行,并将第二个(没有引号)放在第一组中。
  • /: 正则表达式和替换之间的分隔符
  • \1:用组号 1 替换原来的行:1.22.0在这种情况下。
  • /: 最后一个没有选项的分隔符,所以它只会在一行中替换一次。

希望这解释得足够好。

  • 这是错误的。正则表达式并不匹配***有***两个***块***引号的每一行;它匹配具有两个或多个引号字符的每一行(因此它可能只是一对)。并且它没有捕获第二个“引号块”;它捕获了***最后***一个。更准确地说,它捕获最后两个引号之间的所有内容;它会从 ```a"b"c"d``` 捕获 `c`,尽管这没有多大意义。 (2认同)

小智 5

我不知道你对sed.\xc2\xa0\n了解多少。在 sed(1) 中你可能会发现:

\n
\n

sed - 用于过滤和转换文本的流编辑器

\n
\n

和:

\n
\n

-E, -r,--regexp-extended

        \n在脚本中使用扩展正则表达式\n(为了可移植性,使用 POSIX -E)。

\n

\n

sed可以定义,让我说,括号之间的单词模式\n你可以用(反斜杠)替换\n它们,\\后跟一位数字。\xc2\xa0\n在你的问题中,让我写如下:

\n
echo \'"tag_name": "1.22.0"\' | sed -E \'s/"([a-z]+\\_[a-z]+)": "([0-9\\.]+)"/\\2/\'\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • -E使用扩展正则表达式
  • \n
  • \'s/Part1/Part2/主要结构
  • \n
  • "正则表达式模式开头为"
  • \n
  • ([a-z]+\\_[a-z]+)第一个单词模式包含两个字符部分_
  • \n
  • ": "之后这些序列符号就会出现
  • \n
  • ([0-9\\.]+)第二个单词模式包含一个或多个\n数字.
  • \n
  • "模式以其结束。
  • \n
  • \\2现在你调用第二个单词模式
  • \n
\n