我认为i
和I
都表示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正则表达式含义的完整参考?
答案 0 :(得分:0)
i
和I
确实是s
命令的标志;它们通常不适用于sed
中正则表达式的所有用法。 GNU手册页对于s
接受哪些标志(甚至是s
接受标志的事实)是奇怪的,所以你必须查看信息页面(运行info sed
)
正则表达式的其他用法受其使用函数的控制。
在其他示例中,i
和I
是应用于与正则表达式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
变体,文档的命令,命令和完整性可能会有所不同。