如何使字符串中的字符不被认为正则元字符

如何使字符串中的字符不被认为正则元字符

不成功的
复制内容到剪贴板
代码:
[0 No.1692 huan@huan ~]$ a='abc[def]ghi'

[0 No.1693 huan@huan ~]$ b='abc[def]ghijklmn'

[0 No.1694 huan@huan ~]$ echo $b | sed "/$a/ s/$a/XX/"
abc[def]ghijklmn

[1 No.1695 huan@huan ~]$ echo $b | sed '/'"$a"'/ s/'"$a"'/XX/'
abc[def]ghijklmn

[0 No.1696 huan@huan ~]$
成功的
复制内容到剪贴板
代码:
[0 No.1697 huan@huan ~]$ a='abc\[def\]ghi'

[0 No.1698 huan@huan ~]$ echo $b | sed "/$a/ s/$a/XX/"
XXjklmn

[0 No.1699 huan@huan ~]$
'[]'被sed认为是regex元字符,导致在第一示例中模式匹配和替换都不成功
grep,甚至Perl都有这个问题
请教如何使一个字符串只有其字面意思      
`grep -F' 不处理特殊字符;对于 sed、perl 等,不知道有没有这种选项,如果没有,自己可以写一个函数将特殊字符转义一下      

找到Perl的解决方法
复制内容到剪贴板
代码:
[0 No.1844 huan@huan ~]$ perl -le ' $_ = "abc[def]ghi"; $p = "[def]"; s/$p/X/g; print '
abc[XXX]ghi

[0 No.1845 huan@huan ~]$ perl -le ' $_ = "abc[def]ghi"; $p = "[def]"; s/\Q$p/X/g; print '
abcXghi
见http://www.pgsqldb.org/bin/view/Perl/PatternMatching
在此文中学到一个词
可以替换我的罗唆的标题
引用:
消元
继续关注 sed 的解决方法