Home > Software engineering >  Expand environment variable inside Perl regex
Expand environment variable inside Perl regex

Time:11-01

I am having trouble with a short bash script. It seems like all forward slashes needs to be escaped. How can required characters in expanded (environment) variables be escaped before perl reads them? Or some other method that perl understands.

This is what I am trying to do, but this will not work properly.

eval "perl -pi -e 's/$HOME\/_TV_rips\///g'" '*$videoID.info.json'

That is part of a longer script where videoID=$1. (And for some reason perl expands variables both within single and double quotes.)

This simple workaround with no forward slash in the expanded environment variable $USER works. But I would like to not have /Users/ hard coded:

eval "perl -pi -e 's/\/Users\/$USER\/_TV_rips\///g'" '*$videoID.info.json'

This is probably solvable in some better way fetching home dir for files or something else. The goal is to remove the folder name in youtube-dl's json data. I am using perl just because it can handle extended regex. But perl is not required. Any better substitute for extended regex on macOS is welcome.

CodePudding user response:

You are building the following Perl program:

s//home/username\/_TV_rips\///g

That's quite wrong.

You shouldn't be attempting to build Perl code from the shell in the first place. There are a few ways you could pass values to the Perl code instead of generating Perl code. Since the value is conveniently in the environment, we can use

perl -i -pe's/\Q$ENV{HOME}\E\/_TV_rips\///' *"$videoID.info.json"

or better yet

perl -i -pe's{\Q$ENV{HOME}\E/_TV_rips/}{}' *"$videoID.info.json"

(Also note the lack of eval and the fixed quoting on the glob.)

CodePudding user response:

Just assembling the ideas in comments, this should achieve what you expected :

perl -pi -e 's{$ENV{HOME}/_TV_rips/}{}g' *$videoID.info.json

CodePudding user response:

All RegEx delimiters must of cource be escaped in input String.

But as Stefen stated, you can use other delimiters in perl, like %, §.

Special characters

  1. # Perl comment - don't use this
  2. ?,[], {}, $, ^, . Regex control chars - must be escaped in Regex. That makes it easier if you have many slashes in your string.

You should always write a comment to make clear you are using different delimiters, because this makes your regex hard to read for inexperienced users.

Try out your RegEx here: https://regex101.com/r/cIWk1o/1

  • Related