我想要以下工作:
line='"e[?20"'; echo 'foo - "e[?20"' | grep "^.* - $line$"
只要我没有奇特的角色,一切都很好:
line='"bar"'; echo 'foo - "bar"' | grep "^.* - $line$"
答案 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"