sed中'i'和'I'之间的区别

时间:2015-08-21 14:18:37

标签: regex bash sed

我认为iI都表示sed中的忽略,例如

$ echo "abcABC"|sed -e 's/a/j/gi'
jbcjBC
$ echo "abcABC"|sed -e 's/a/j/gI'
jbcjBC

然而,看起来它只是替代:

$ echo "abcABC"|sed -e '/a/id'  # <--
d
abcABC
$ echo "abcABC"|sed -e '/a/Id'

$

这真令人困惑。

在哪里可以找到sed正则表达式含义的完整参考?

2 个答案:

答案 0 :(得分:0)

iI确实是s命令的标志;它们通常不适用于sed中正则表达式的所有用法。 GNU手册页对于s接受哪些标志(甚至是s接受标志的事实)是奇怪的,所以你必须查看信息页面(运行info sed

正则表达式的其他用法受其使用函数的控制。

在其他示例中,iI是应用于与正则表达式sed匹配的行的实际a函数。 i表示插入文字。据我所知,I是一个无法识别的函数,因此被忽略,将d作为函数,删除该行。 (我对I的解释可能是错误的。)

答案 1 :(得分:0)

描述s(替换)命令选项的部分中的sed man page in FreeBSD仅表示:

    i or I   Match the regular expression in a case-insensitive
             way

因此,以下内容完全相同:

 s/a/j/gi
 s/a/j/gI

但那只是使用i作为s命令的修饰符。在第二个示例中,您使用i作为命令。本案例中的手册页说明:

 [1addr]i\
 text    Write text to the standard output.

至少在FreeBSD的sed中,没有I(capital-I)命令。因此,您的sed脚本/a/id将(1)匹配包含a的行,如果找到(2)则打印文本&#34; d&#34;。这就是你所看到的。

由于I不是命令,我原本预计会出现错误,但我的结果与您的结果相符 - /a/Id似乎会消除输出。

请注意,根据您使用的sed变体,文档的命令,命令和完整性可能会有所不同。