views:

565

answers:

1

I am attempting to write a one-line Perl script that will toggle a line in a configuration file from "commented" to not and back. I have the following so far:

perl -pi -e 's/^(#?)(\tDefaultServerLayout)/ ... /e' xorg.conf

I am trying to figure out what code to put in the replacement (...) section. I would like the replacement to insert a '#' if one was not matched on, and remove it if it was matched on.

pseudo code:

if ( $1 == '#' ) then
   print $2
else
   print "#$2"

My Perl is very rusty, and I don't know how to fit that into a s///e replacement.

My reason for this is to create a single script that will change (toggle) my display settings between two layouts. I would prefer to have this done in only one script.

I am open to suggestions for alternate methods, but I would like to keep this a one-liner that I can just include in a shell script that is doing other things I want to happen when I change layouts.

+12  A: 
perl -pi -e 's/^(#?)(?=\tDefaultServerLayout)/ ! $1 && "#" /e' foo

Note the addition of ?= to simplify the replacement string by using a look-ahead assertion.

Some might prefer s/.../ $1 ? "" : "#" /e.

ysth