Problems passing shell arguments to perl


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Problems passing shell arguments to perl
# 1  
Old 02-05-2014
Question Problems passing shell arguments to perl

Semi-newbie, so flame throwers to 'singe-only', please. ;-)

I have a large number of (say) .html files, where I'd like to do a recursive in-place search and replace a particular string. The following bit of perl works fine:

Code:
perl -pi -e 's/oldstring/newstring/g' `find ./ -name *.html`

But, I can never remember the specific commends (getting old), so I generally dump this sort of thing into a script. Say, a bash script. But, I'm having a heck of a time getting the script to take command line args and pass them to the perl script. Imagine said script is called replace_string

Suppose I want to change the occurrence of 2013 to 2014. What I want to be able to do is type

> replace_string 2013 2014

So in my bash script, I've tried the following:

Code:
#!/bin/bash
echo "target string -- $1"
echo "new string -- $2"
perl -pi -e 's/$1/$2/g' `find ./ -name *.html`

But, this doesn't work. I've tried putting double-quotes around $1 and $2, but..nada.

I'm guessing this is a simple no-brainer sort of thing, but I haven't sussed it out yet. Pointers to the obvious appreciated.

(Note: I've no doubt there are other ways to do the inplace search and replace, but that isn't the point here -- the problem is general -- passing bash shell comand args to a perl function)
# 2  
Old 02-05-2014
Your shell variables should appear in double quotes outside of single quotes. In this simple case you can do
Code:
perl -pi -e "s/$1/$2/g" `find ./ -name *.html`

More complex perl code should be in single quotes, but ending around the shell variables as follows:
Code:
perl 'print $perlvar,"'"$shellvar"'",$perlvar;'

The shell sees 3 strings and does variable substitution in the middle string because it is in double quotes.
--
This won't work if the file names have space characters, or can result in 'too many arguments' if there are many files.
Safer is
Code:
find ./ -name *.html -exec perl -pi -e "s/$1/$2/g" {} +


Last edited by MadeInGermany; 02-07-2014 at 08:45 AM.. Reason: highlighted with colors
This User Gave Thanks to MadeInGermany For This Post:
# 3  
Old 02-06-2014
Quote:
Originally Posted by MadeInGermany
Your shell variables should appear in double quotes outside of single quotes. In this simple case you can do
Code:
perl -pi -e "s/$1/$2/g" `find ./ -name *.html`

More complex perl code should be in single quotes, but ending around the shell variables as follows:
Code:
perl 'print $perlvar,"'"$shellvar"'",$perlvar;'

The shell sees 3 strings and does variable substitution in the middle string because it is in double quotes.
--
This won't work if the file names have space characters, or can result in 'too many arguments' if there are many files.
Safer is
Code:
find ./ -name *.html -exec perl -pi -e "s/$1/$2/g" {} +

Perfect. In spaces in my file names, but the occasional hyphen (I know, I should *never* use hyphens, but...)

Thanks very much for the clear and thorough response.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

C shell script passing arguments problem.

I found something insteresting when I tested passing arguments into my scripts. My scripts is as below. % cat passarg.env #!/bin/csh echo "passarg: argv = $argv argv = $argv" passarg1.env $* % cat passarg1.env #!/bin/csh echo "passarg1: argv = $argv argvp=$argv" set str = "test... (5 Replies)
Discussion started by: bestard
5 Replies

2. Shell Programming and Scripting

Shell scripting with passing arguments

Hi All, I am using the script for creating local queue and passing the arguments while running the script as below n=0 while do e=`expr $n + 3` echo 'DEFINE QL('$e') MAXDEPTH('$6') MAXMSGL('$7') DEFPSIST('$8') '$9'' | /apps/mqm_opt/bin/runmqsc $2 n=`expr $n + 1` done Running the... (5 Replies)
Discussion started by: Anusha M
5 Replies

3. Shell Programming and Scripting

Passing multiple arguments to a shell script

Hi Gurus, Need some help with the shell scripting here. #!/bin/ksh ps -ef | grep -i sample.ksh | grep -v grep > abc.txt if then echo "sample.ksh is executing" else echo "sample.ksh is not executing" fi (1 Reply)
Discussion started by: jayadanabalan
1 Replies

4. Shell Programming and Scripting

Passing arguments to a perl script

Hi I need to pass comma seperated arguments to a perl script? It is like: Exect.pl -d GUI1,GUI2,GUI3 and I need to store these argsGUI1,GUI2,GUI3 in an array. can anyone suggest how to do that: (1 Reply)
Discussion started by: rkrish
1 Replies

5. Programming

Passing arguments from java to script shell

Hello Please i want to pass parameter (the string s) to the shell script: Quote: String s="Hello"; Process process = Runtime.getRuntime().exec("sh script1.sh"); How can i do please? Thank you (0 Replies)
Discussion started by: chercheur857
0 Replies

6. Shell Programming and Scripting

Passing Arguments in Shell Scripts

Hello everybody! First time posting here:) Right, I am trying to pass arguments in my shell scripts using $1, $2 and $3 etc using if else statement........ This is my shell script which is based on serching the google website #!/bin/sh wget -t1 -E -e robots=off - -awGet.log -T 200 -H... (47 Replies)
Discussion started by: kev_1234
47 Replies

7. Shell Programming and Scripting

Passing arguments to Perl Function

Hi All, I am trying to pass an argument called "Pricelist" to a Perl function, then the function will open and print out the contents of the file named "Pricelist". But i can't seem to do it using my below code. Can any expert give some advice? #!/usr/local/bin/perl $DATABASE =... (1 Reply)
Discussion started by: Raynon
1 Replies

8. Shell Programming and Scripting

passing runtime arguments to a shell script...

hi I am new to shell programming.....my question is while running one of my shell program it stops in between to accept input from the user and proceeds furthur after giving input....I want to know whether I can set this input through some files so that the shell acript reads the input from the... (10 Replies)
Discussion started by: santy
10 Replies

9. UNIX for Dummies Questions & Answers

passing arguments from shell to java

Hi: I have a script called runjava: The content --- search=$1 dpi=$2 prefix=$3 input=$4 output=$5 java -Djava.library.path=./lib/path/Lib -classpath .:lib/path/Lib/mylib.jar myclass $search $dpi $prefix $input $output How does myclass parse arguments --- String searchTerm =... (3 Replies)
Discussion started by: kenpeter
3 Replies

10. Shell Programming and Scripting

Passing arguments to a Perl script

I am playing around with Perl and wrote the script below that is executed from the command line, it will split data up in a file based on a value supplied. When executed you provide two arguments - the file that contains the data to be split and the character you want to split by. It works as... (4 Replies)
Discussion started by: jyoung
4 Replies
Login or Register to Ask a Question