Substitution in text file **without** regular expressions
export FIND='find this'
export REPLACE='replace with this'
ruby -p -i -e "gsub(ENV['FIND'], ENV['REPLACE'])" path/to/file
This is the only 100% safe solution here, because:
- It's a static substition, not a regexp, no need to escape anything (thus, superior to using
sed
) - It won't break if your string contains
}
char (thus, superior to a submitted Perl solution) - It won't break with any character, because
ENV['FIND']
is used, not$FIND
. With$FIND
or your text inlined in Ruby code, you could hit a syntax error if your string contained an unescaped'
.
When you don't need the power of regular expressions, don't use it. That is fine.
But, this is not really a regular expression.
sed 's|literal_pattern|replacement_string|g'
So, if /
is your problem, use |
and you don't need to escape the former.
PS: About the comments, also see this Stackoverflow answer on Escape a string for sed search pattern.
Update: If you are fine using Perl try it with \Q
and \E
like this,
perl -pe 's|\Qliteral_pattern\E|replacement_string|g'
@RedGrittyBrick has also suggested a similar trick with stronger Perl syntax in a comment here or here
The replace
command will do this.
https://linux.die.net/man/1/replace
Change in place:
replace text replacement -- path/to/the/file
To stdout:
replace text replacement < path/to/the/file
Example:
$ replace '.*' '[^a-z ]{1,3}' <<EOF
> r1: /.*/g
> r2: /.*/gi
> EOF
r1: /[^a-z ]{1,3}/g
r2: /[^a-z ]{1,3}/gi
The replace
command comes with MySQL or MariaDB.