Bash 如何对包含特殊字符的任意字符串进行grep
我想让以下工作正常进行:Bash 如何对包含特殊字符的任意字符串进行grep,bash,grep,Bash,Grep,我想让以下工作正常进行: line='"e[?20"'; echo 'foo - "e[?20"' | grep "^.* - $line$" 只要我没有花哨的角色,一切都很好: line='"bar"'; echo 'foo - "bar"' | grep "^.* - $line$" 您可以使用PCRE的\Qliteral blocks\E: line='"e[?20"'; echo 'foo - "e[?20"' | grep -P "^.* - \Q$line\E$" 出现在\Q
line='"e[?20"'; echo 'foo - "e[?20"' | grep "^.* - $line$"
只要我没有花哨的角色,一切都很好:
line='"bar"'; echo 'foo - "bar"' | grep "^.* - $line$"
您可以使用PCRE的
\Qliteral blocks\E
:
line='"e[?20"'; echo 'foo - "e[?20"' | grep -P "^.* - \Q$line\E$"
出现在
\Q
之后和下一个\E
之前的每个字符都将被理解为文字字符,而不是它可以表示的元字符。尝试转义行中的[
字符
line='"e\[?20"'; echo 'foo - "e[?20"' | grep "^.* - $line$"
如果所有可用的工具都是标准UNIX工具,则可以使用以下命令在awk中执行文字字符串比较和字符串位置检查:
$ line='"e[?20"'; echo 'foo - "e[?20"' |
awk 'BEGIN{str=" - "ARGV[1]; ARGV[1]=""; lgth=length(str)}
(s=index($0,str)) && ((s+lgth-1)==length())' "$line"
foo - "e[?20"
我很惊讶
?
也不需要转义。啊,明白了,grep默认使用BRE
,其中?
是量词,而?
是文字字符辉煌,刚刚锁定了它。thx^.*
没有做任何有用的事情。您只需将相同的字符串与grep“-$line$”匹配即可