如何禁用 grep [] 语法中 ^ 字符的特殊含义?

Mik*_*iak 3 regex grep

假设,我有一个如下所示的文件:

aaa1bbb
aaa^bbb
aaa\bbb
aaa%bbb
aaa*ccc
aaa(ccc
aaa)bbb
Run Code Online (Sandbox Code Playgroud)

我想找到包含^or%和 then的所有行bbb。我的预期结果:

aaa^bbb
aaa%bbb
Run Code Online (Sandbox Code Playgroud)

当我执行时grep '[^%]bbb' t1我收到了

aaa1bbb
aaa^bbb
aaa\bbb
aaa)bbb
Run Code Online (Sandbox Code Playgroud)

这是完全正确的。^是 grep[]语法中的元字符。我有除正则表达式之外的所有结果%bbb。我明白这一点。我尝试用\这样的方式禁用元字符:grep '[\^%]bbb' t1我收到了:

aaa^bbb
aaa\bbb
aaa%bbb
Run Code Online (Sandbox Code Playgroud)

为什么我的aaa\bbb结果中出现了一行?问题是:如何禁用^grep[]语法中字符的特殊含义?fgrep不使用或其他解决方法是否可以?

Wik*_*żew 5

^在方括号表达式内创建文字字符,请将其 NOT 放在其开头:

grep '[%^]bbb' t1
Run Code Online (Sandbox Code Playgroud)

这是所谓的“智能放置”技术的一部分,例如,要使用]括号内表达式,它必须放置在括号表达式的开头,并且-应该位于括号表达式的开头或结尾。

查看在线演示

#!/bin/bash
s='aaa1bbb
aaa^bbb
aaa\bbb
aaa%bbb
aaa*ccc
aaa(ccc
aaa)bbb'
grep '[%^]bbb' <<< "$s"
Run Code Online (Sandbox Code Playgroud)

输出:

aaa^bbb
aaa%bbb
Run Code Online (Sandbox Code Playgroud)