J'ai besoin de grep
pour string contenant des caractères spéciaux et assurez-vous qu'il est à la fin de la ligne
Par exemple, dans la list:
abc defg [h] ij
Je veux grep pour defg[h]ij$
xyz 123 * 456
Je veux grep pour 123*456$
La string de search et la correspondance possible contenant des caractères spéciaux sont variables, ainsi un masquage fixe n'est pas possible.
Je cherche quelque chose comme grep -F
en combinaison avec la fin de ligne $
anchor. -w
ne suffira pas, il doit être fin de ligne.
Une approche consiste à échapper à ces caractères spéciaux avant d'appeler grep
.
Avec zsh
:
ssortingng='123*.$[]' grep -e "${ssortingng//(#m)[[^.\\\$*]/\\$MATCH}\$" file
ou POSIXly:
escaped_ssortingng=$(printf '%s\n' "$ssortingng" | sed 's/[[^.\$*]/\\&/g') grep -e "$escaped_ssortingng\$" file
ou en supposant que la $ssortingng
ne contient pas \E
, avec GNU grep
ou pcregrep
:
grep -Pe "\Q$ssortingng\E\$" file
ou vous pourriez utiliser awk
comme:
STRING="$ssortingng" awk 'BEGIN {s = ENVIRON["STRING"]; n = length(s)} length >= n && substr($0, length - n + 1, n) == s'
ou perl
:
STRING="$ssortingng" perl -ne 'print if /\Q$ENV{"STRING"}\E$/'
(cette fois, perl
sait qu'un \E
trouvé dans $ENV{"STRING"}
ne marque pas la fin de la string \ Quoted).