我需要grep
包含特殊字符的字符串并确保它位于行尾
例如,在列表中:
abc defg[h]ij
我想要 grepdefg[h]ij$
xyz 123*456
我想 grep123*456$
包含特殊字符的搜索字符串和可能的匹配是变化的,因此固定的屏蔽是不可能的。
我正在寻找类似grep -F
与行尾$
锚结合的东西。-w
还不够,它必须是行尾。
答案1
一种方法是在调用之前转义这些特殊字符grep
。
和zsh
:
string='123*.$[]'
grep -e "${string//(#m)[[^.\\\$*]/\\$MATCH}\$" file
或 POSIXly:
escaped_string=$(printf '%s\n' "$string" | sed 's/[[^.\$*]/\\&/g')
grep -e "$escaped_string\$" file
或者假设$string
不包含\E
, 与 GNUgrep
或pcregrep
:
grep -Pe "\Q$string\E\$" file
或者你可以awk
这样使用:
STRING="$string" awk 'BEGIN {s = ENVIRON["STRING"]; n = length(s)}
length >= n && substr($0, length - n + 1, n) == s'
或者perl
:
STRING="$string" perl -ne 'print if /\Q$ENV{"STRING"}\E$/'
(这一次,perl
知道 a \E
find in$ENV{"STRING"}
并不标记 \Quoted 字符串的结尾)。