grep 在行尾固定字符串

Pet*_*erK 4 grep text-processing

我需要grep包含特殊字符的字符串并确保它在行尾

例如,在列表中:

  • abc defg[h]ij
    我想为defg[h]ij$

  • xyz 123*456
    我想搜索123*456$

包含特殊字符的搜索字符串和可能的匹配是不同的,因此固定掩码是不可能的。

我正在寻找类似grep -F与行尾$锚点相结合的东西。-w还不够,它必须是行尾。

Sté*_*las 5

一种方法是在调用之前转义这些特殊字符grep

zsh

string='123*.$[]'
grep -e "${string//(#m)[[^.\\\$*]/\\$MATCH}\$" file
Run Code Online (Sandbox Code Playgroud)

或 POSIXly:

escaped_string=$(printf '%s\n' "$string" | sed 's/[[^.\$*]/\\&/g')
grep -e "$escaped_string\$" file
Run Code Online (Sandbox Code Playgroud)

或假设$string不包含\E, 与 GNUgreppcregrep

grep -Pe "\Q$string\E\$" file
Run Code Online (Sandbox Code Playgroud)

或者你可以使用awk像:

STRING="$string" awk 'BEGIN {s = ENVIRON["STRING"]; n = length(s)}
                      length >= n && substr($0, length - n + 1, n) == s'
Run Code Online (Sandbox Code Playgroud)

perl

STRING="$string" perl -ne 'print if /\Q$ENV{"STRING"}\E$/'
Run Code Online (Sandbox Code Playgroud)

(这一次,perl知道 a \Efound in$ENV{"STRING"}不标记 \Quoted 字符串的结尾)。