tags:

views:

91

answers:

2

I want to convert block size into MB. I am using the /e option in my substitution. When I add starting MB in substitution part it giving me the error.

e.g:

This works.

 echo "16777216 SELECT" |perl -lane 's#(\d+)(\s+SELECT)#$1/(1024*1024*2)#e; print'
8

This giving me the error.

echo "16777216 SELECT" |perl -lane 's#(\d+)(\s+SELECT)#$1/(1024*1024*2) MB $2#e; print'
Bareword found where operator expected at -e line 1, near ") MB"
        (Missing operator before MB?)
syntax error at -e line 1, near ") MB "
Execution of -e aborted due to compilation errors.

Any help fixing the second one?

+5  A: 

Change

(1024*1024*2) MB $2

to

(1024*1024*2)."MB".$2

The /e modifier tells the engine to treat the substitution field as Perl code.

codaddict
The /e modifier expects the replacement to be valid, compilable code.
davorg
@davorg: Was about to change that.
codaddict
thanks, it works
sfgroups
+2  A: 

The /e switch turns the replace expression into a regular perl expression. You need to quote the ' MB' and use concatenation (.) .

's#(\d+)(\s+SELECT)#$1/(1024*1024*2) . q[ MB] . $2#e

Should work.

Axeman