I want to replace the string using a shell variable.
today =`date '+%Y%m%d'`
perl -p -i -e 's/file"20221212"/file="${today}"/g'
The expectation is file="20221215"
.
But it failed, result is file=""
.
How to escape this case?
I want to replace the string using a shell variable.
today =`date '+%Y%m%d'`
perl -p -i -e 's/file"20221212"/file="${today}"/g'
The expectation is file="20221215"
.
But it failed, result is file=""
.
How to escape this case?
Your issue is shell quoting. Using single quotes, '
, to delimit the Perl code disables all variable expansion. You need to use double quotes, "
, to get variable expansion.
Using shell without any Perl to illustrate the issue
today=`date '+%Y%m%d'`
echo 'today is $today'
will output this -- with no expansion of $today
today is $today
now with double quotes
today=`date '+%Y%m%d'`
echo "today is $today"
outputs this -- $today
has been expanded.
today is 20221215
Applying that to your code (I've removed the -i
option to make it easier to see the results) and escaped all double quotes in the perl code with \"
echo 'file"20221212"' >input.txt
perl -p -e "s/file\"20221212\"/file=\"${today}\"/g" input.txt
gives
file="20221215"
Here I am giving you the hint how it should be:
I cannot reproduce the issue from your code.
#!/bin/sh
today=`date '+%Y%m%d'`
echo "today:$today"
file="input.txt";
perl -pi -e 's/file20221212/file='${today}'/g' $file
where input.txt
contains:
file20221212
The two earlier answers are horrible. Don't generate Perl code from the shell.
This question was already asked and answered here: How can I process options using Perl in -n or -p mode?
It provides three solution, including
perl -spe's/file\K"20221212"/="$today"/g' -- -today="$today"
TODAY="$today" perl -pe's/file\K"20221212"/="$ENV{today}"/g'
Alternatively, you could also avoid date
and passing a value entirely.
perl -MPOSIX -pe'
BEGIN { $today = strftime "%Y%m%d", localtime }
s/file\K"20221212"/="$today"/g
'