Raza Rafaideen
Raza Rafaideen

Reputation: 2241

perl -p -i -e inside a shell script

#!/usr/bin/env bash
DOCUMENT_ROOT=/var/www/html/

rm index.php
cd modules/mymodules/

perl -p -i -e 's/x.xx.xx.y/dd.dd.ddd.dd/g' `grep -ril y.yy.yy.y *`

shows shows a warning

-i used with no filenames on the command line, reading from STDIN.

It prevents running rest of the scripts.

Any solutions ?

Actually I need to run

perl -p -i -e 's/x.xx.xx.y/dd.dd.ddd.dd/g' `grep -ril y.yy.yy.y *`
Inside a shell script

I am using ubuntu with docker.

Upvotes: 2

Views: 1310

Answers (1)

Dave Cross
Dave Cross

Reputation: 69274

Let's look at this a step at a time. First, you're running this grep command:

grep -ril y.yy.yy.y *

This recursively searches all files and directories in your current directory. It looks for files containing the string "y.yy.yy.yy" in any case and returns a list of the files which contain this text.

This command will return either a list of filenames or nothing.

Whatever is returned from that grep command is then passed as arguments to your Perl command:

perl -p -i -e 's/x.xx.xx.y/dd.dd.ddd.dd/g' [list of filenames]

If grep returns a list of files, then the -p option here means that each line in every file in the list is (in turn) run through that substitution and then printed to a new file. The -i means there's one new file for each old file and the new files are given the same names as the old files (the old files are deleted once the command has run).

So far so good. But what happens if the grep doesn't return any filenames? In that case, your Perl command doesn't get any filenames and that would trigger the error that you are seeing.

So my (second) guess is that your grep command isn't doing what you want it to and is returning an empty list of filenames. Try running the grep command on its own and see what you get.

Upvotes: 5

Related Questions