如何grep获取包含特殊字符的任意字符串

时间:2018-12-20 10:28:05

标签: bash grep

我想要以下工作:

line='"e[?20"'; echo 'foo - "e[?20"' | grep "^.* - $line$"

只要我没有奇特的角色,一切都很好:

line='"bar"'; echo 'foo - "bar"' | grep  "^.* - $line$"

3 个答案:

答案 0 :(得分:1)

您可以使用PCRE的\Qliteral blocks\E

line='"e[?20"'; echo 'foo - "e[?20"' | grep -P "^.* - \Q$line\E$"

出现在\Q之后和下一个\E之前的每个字符将被理解为文字字符,而不是它可以表示的元字符。

答案 1 :(得分:0)

尝试在行中转义[字符。

line='"e\[?20"'; echo 'foo - "e[?20"' | grep "^.* - $line$"

答案 2 :(得分:0)

如果所有可用的都是标准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"