views:

134

answers:

4
end_date=$(date +"%m/%d/%Y")
/usr/bin/perl -pi -e "s/_end_date_/${end_date}/g" filename

I want to replace string '_end_date_' with current date. Since current date has slashes in it(yes I want the slashes), I need to escape them. How can I do this?

I've tried several ways like replacing slashes with "\/" using sed and perl itself but it didn't work. Finally I used 'cut' to break date in 3 parts and escaped slashes but this solution doesn't look good. Any better solution?

+13  A: 

In perl you can choose which character to use to separate parts of a regular expression

end_date=$(date +"%m/%d/%Y")
/usr/bin/perl -pi -e "s#_end_date_#${end_date}#g" filename

will work fine.

This is to avoid the 'leaning toothpick' syndrome with \/ alternating.

Peter Tillemans
+5  A: 

Use a different s delimiter: s{all/the/slashes/you/want/}{replacement}.

Pedro Silva
+1  A: 

I would recommend changing the delimiter, but you can almost always get by with quotemeta:

/usr/bin/perl -pi -e "my \$ed=quotemeta('${end_date}');s/_end_date_/\$ed/g" filename

But you also have this route:

/usr/bin/perl -pi -e 'BEGIN { use POSIX qw<strftime>; $ed=quotemeta(strftime( q[%m/%d/%Y], localtime())); } s/_end_date_/$ed/'

which does the same thing as your two lines.

Axeman
A: 

Building on Axeman's answer, the following works for me :

 perl -MPOSIX=strftime  -p -e'$ed=strftime( q[%m/%d/%Y], localtime()) ;s/_end_date_/$ed/'

A few things to note

  • The quotemeta isn't needed because the compiler isn't looking for a / in the variable $ed.
  • I have used single quotes ' rather than " as otherwise you end up having to quote $
  • I prefer using -MPOSIX=strftime to BEGIN { use POSIX qw<strftime> }
justintime