Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何对包含特殊字符的任意字符串进行grep_Bash_Grep - Fatal编程技术网

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$”匹配即可