grep 行尾固定字符串

grep 行尾固定字符串

我需要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, 与 GNUgreppcregrep:

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 \Efind in$ENV{"STRING"}并不标记 \Quoted 字符串的结尾)。

相关内容