Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to escape a previously unknown string in regular expression?

I need to egrep a string that isn't known before runtime and that I'll get via shell variable (shell is bash, if that matters). Problem is, that string will contain special characters like braces, spaces, dots, slashes, and so on.

If I know the string I can escape the special characters one at a time, but how can I do that for the whole string?

Running the string through a sed script to prefix each special character with \ could be an idea, I still need to rtfm how such a script should be written. I don't know if there are other, better, options.

I did read re_format(7) but it seems there is no such thing like "take the whole next string as literal"...

EDIT: to avoid false positives, I should also add newline detection to the pattern, eg. egrep '^myunknownstring'

like image 208
Luke404 Avatar asked Mar 16 '11 17:03

Luke404


People also ask

How do you escape from STR?

In the platform, the backslash character ( \ ) is used to escape values within strings. The character following the escaping character is treated as a string literal.

What is escape regex?

Escape converts a string so that the regular expression engine will interpret any metacharacters that it may contain as character literals.


2 Answers

If you need to embed the string into a larger expression, sed is how I would do it.

s_esc="$(echo "$s" | sed 's/[^-A-Za-z0-9_]/\\&/g')" # backslash special characters
inv_ent="$(egrep "^item [0-9]+ desc $s_esc loc .+$" inventory_list)"
like image 148
geekosaur Avatar answered Sep 27 '22 16:09

geekosaur


Use the -F flag to make the PATTERN a fixed literal string

$ var="(.*+[a-z]){3}"
$ echo 'foo bar (.*+[a-z]){3} baz' | grep -F "$var" -o
(.*+[a-z]){3}
like image 22
SiegeX Avatar answered Sep 27 '22 17:09

SiegeX