sed 和正则表达式中逗号“,”的所有含义是啥?

Posted

技术标签:

【中文标题】sed 和正则表达式中逗号“,”的所有含义是啥?【英文标题】:What are all of the meanings for commas "," in sed and regex?sed 和正则表达式中逗号“,”的所有含义是什么? 【发布时间】:2020-04-29 22:06:05 【问题描述】:

此脚本用于 Arduino IDE 的 install.sh 文件中:

  sed -e "s,<BINARY_LOCATION>,\"$SCRIPT_PATH/arduino\",g" \
      -e "s,<ICON_NAME>,$RESOURCE_NAME,g" "$SCRIPT_PATH/lib/desktop.template" > "$TMP_DIR/$RESOURCE_NAME.desktop"

该文件来自 Linux 64 位分发版本 1.8.12(当前,2020 年 4 月)的 tarball。

逗号有什么作用?有人对 sed 和正则表达式在所有情况下的逗号功能有很好的参考吗?

以下是我如何分解命令以及我一直在搜索的所有地方。网上有很多关于如何操作包含逗号的信息或在信息中添加逗号的参考资料。逗号的功能不太容易找到。搜索“,”或“逗号”并没有让我走得很远。这个 Stack Overflow 问题旨在添加某人可以找到的搜索结果。我的兴趣是学术。

***edit note: some of this is wrong. see answer from wjandrea for 
              corrections
sed - stream editor for filtering and transforming text (1)
    -e script, --expression=script
       add the following script to the commands to be executed (1) 
    s substitution
       Its basic concept is simple: the s command attempts to match 
       the pattern space against the supplied regular expression 
       regexp; if the match is successful, then that portion of the 
       pattern space which was matched is replaced with replacement(2,3)
    ,  ???
    <> RegExpression for \< match beginning of word \> end of word (4)
    $  Match the last line. 
       To ALLOW the Unix shell to interpret the dollar sign, put the 
       script in double quotes. sed "s/_terminal-type_/$TERM/g" (5)
     A group of commands may be enclosed between  and  characters.
       This is particularly useful when you want a group of commands 
       to be triggered by a single address (or address-range) match.(6)
    g  Copy/append hold space to pattern space. (1) Replace the 
       contents of the pattern space with the contents of the hold 
       space. (7) - find "Special Applications:"
(1)https://linux.die.net/man/1/sed (2)http://sed.sourceforge.net/sedfaq4.html#s4.30.1 (3)https://www.gnu.org/software/sed/manual/html_node/The-_0022s_0022-Command.html#The-_0022s_0022-Command (4)https://www.gnu.org/software/sed/manual/html_node/regexp-extensions.html#regexp-extensions (5)https://www.gnu.org/software/sed/manual/html_node/BRE-syntax.html#BRE-syntax (6)https://www.gnu.org/software/sed/manual/sed.html#Common-Commands (7)http://sed.sourceforge.net/sed1line.txt sed 中的正则表达式:https://www.gnu.org/software/sed/manual/html_node/sed-regular-expressions.html#sed-regular-expressions

【问题讨论】:

不是正则表达式的一部分,但它是默认/的分隔符替换,将其更改为管道|或任何不属于正则表达式的字符串。 我唯一能想到逗号在正则表达式中除了“匹配逗号字符”之外的其他含义是在 X,Y 块中,它用于分隔重复计数。 这不是真正的默认值; s 命令后面的任何字符都是分隔符。但从历史上看,我怀疑 / 分隔符,然后有人想到允许任意分隔符减少必须转义 POSIX 路径分隔符的想法。 逗号在 sed 中用于分隔 range address,在 regexp 内,也可以用作 delimiter 的 subsitute 命令或匹配 text。 【参考方案1】:

在 sed 中,s 之后的字符用作分隔符。斜线/ 是标准。

/ 字符可以被任何给定的s 命令中的任何其他单个字符统一替换。

Arduino 脚本可能使用备用分隔符来避免在$SCRIPT_PATH 中转义斜线,这也不太可能包含逗号。比较:

s/<BINARY_LOCATION>/\/some\/path\/arduino/
s,<BINARY_LOCATION>,/some/path/arduino,

也可以使用逗号:

创建address range 例如删除第 2-5 行:2,5d 在大括号之间的regex 中创建“重复范围” 例如匹配 2-5 个 a 的:/a\2,5\/,5 个或更多:/a\5,\/

顺便说一句,你的崩溃的后半部分已经过去了。这是一个更正:

在shell中,双引号字符串受参数扩展,所以$SCRIPT_PATH代表一个变量 &lt;&gt; - 这些都是字面意思。你在想\&lt;\&gt;

g - “全局” - s 的标志:

将替换应用于 所有 匹配到 regexp,而不仅仅是第一个。

【讨论】:

那么s也可以是分隔符? @Mad Huh,你可能认为只有特殊字符才有效,但是:echo foobar | sed 'ssoosus' -> fubar 嘿。那真的很整洁。我想我刚刚找到了我最喜欢的分隔符。

以上是关于sed 和正则表达式中逗号“,”的所有含义是啥?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式中+的含义是啥?

正则表达式中 + 的含义是啥?

正则表达式与grep & sed

正则表达式grep学习

sed 及 正则表达式

/gi 在正则表达式中的含义是啥? [复制]