gpt4 book ai didi

shell - 下面的 Makefile/shell/sed 行有什么作用?

转载 作者:行者123 更新时间:2023-12-01 08:13:42 24 4
gpt4 key购买 nike

这一行直接来自 FullCalendar(一个 jQuery 插件)Makefile .我无法理解它,尤其是带有美元符号的部分。我不知道 make、shell 或 sed 是否“处理”了它。我也不清楚其他(显然?) sed 命令。

DEMO_RE = (<script[^>]*_loader\.js[^>]*><\/script>|<!--\[\[|\]\]-->)[^<]*
DEMO_SED = sed -nE '1h;1!H;$${;g;s/${DEMO_RE}//g;p;}'
  • 1h有什么作用?
  • 美元符号和括号在哪里以及如何解释?
  • 第一个 g 命令和最后一个 p 命令(打印?)做什么?
  • 最佳答案

    真是一块牛黄。
    DEMO_RE是一个正则表达式。粗略地说,这意味着它是对另一个字符序列的描述。任何给定的字符序列与此正则表达式匹配或不匹配。
    DEMO_SED是一个 sed 命令。在这个阶段,它只是一个 Make 变量,一个字符序列,但稍后它可以传递给 shell(在 Make 变量扩展之后),它会将其解释为 sed 命令。

    我不完全理解这个 sed 命令,但这是我最好的尝试。从中间开始:

    sed 's/${DEMO_RE}//'

    使将扩大 ${DEMO_RE}到第一行的 gobbledegook 字符串,寻找与正在考虑的任何文本行匹配的文本,并将匹配文本更改为空(即删除它)。
    sed 's/${DEMO_RE}//g'
    g s 的修饰符命令意味着对所有匹配项进行替换(在本例中为删除),而不仅仅是找到的第一个匹配项。
    sed -nE 's/${DEMO_RE}//g;p'
    -n表示默认不打印结果。 p意味着打印模式空间的内容,因此目前这些更改相互抵消。 E意味着将正则表达式解释为扩展的正则表达式,而不是基本的正则表达式。
    sed -nE '{s/${DEMO_RE}//g;p}'

    花括号将这些命令分组。
    sed -nE '${;g;s/${DEMO_RE}//g;p;}'

    现在事情变得复杂了。 Sed 有第二个缓冲区,称为保持空间。 g命令将保持空间的内容复制到模式空间(这是人们通常使用的缓冲区,也是大多数人知道的唯一缓冲区)。在我们考虑将事物放入保持空间的其他命令之前,这没有多大意义。 $意味着仅当 sed 到达输入的最后一行时才应应用此命令(花括号的内容)。我看不到前导分号的任何目的,但我不敢说它绝对没有任何作用。现在,为了易读性,我将省略替换命令。
    sed -nE '$${;g;p;}'

    由于 Make 尝试扩展以 $ 开头的内容。 ,并且我们想要完整地将 '$' 传递给 sed,我们用另一个 '$' 对其进行转义。使将扩大 $$进入 $并通过 ${...到 shell (它将传递给 sed)。
    sed -nE '1h;1!H;$${;g;p;}'
    1h表示将输入的第一行复制到保持空间。 1!H意味着将除第一行以外的每一行附加到保持空间。记住 -n ;在 sed 执行大括号中的命令组之前不会打印任何内容,这只会在读入最后一行输入时发生。所以:
    sed -nE '1h;1!H;$${;g;s/${DEMO_RE}//g;p;}'

    “将所有输入读入保持空间,不打印任何内容,然后在最后将其全部拉回,删除与(可能扩展的)匹配的所有内容,并打印剩下的内容。”

    这个答案很长;我可以给你一个正则表达式的粗略翻译,但以一种不会混淆这种媒介的方式来做是一种痛苦。它似乎想匹配任何被 script 包围的东西标签或 <!--[[]]--> ,以及所有后续的下一个标签。

    关于shell - 下面的 Makefile/shell/sed 行有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13151117/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com