user1115652
user1115652

Reputation:

Perl from command line: substitute regex only once in a file

I'm trying to replace a line in a configuration file. The problem is I only want to replace only one occurence. Part of the file looks like this. It is the gitolite default config file:

# -----------------------------------------------------------------

# suggested locations for site-local gitolite code (see cust.html)

    # this one is managed directly on the server
    # LOCAL_CODE                =>  "$ENV{HOME}/local",

    # or you can use this, which lets you put everything in a subdirectory
    # called "local" in your gitolite-admin repo.  For a SECURITY WARNING
    # on this, see http://gitolite.com/gitolite/cust.html#pushcode
    # LOCAL_CODE                =>  "$rc{GL_ADMIN_BASE}/local",

# ------------------------------------------------------------------

I would like to set LOCAL_CODE to something else from the command line. I thought I might do it in perl to get pcre convenience. I'm new to perl though and can't get it working.

I found this:

perl -i.bak -p -e’s/old/new/’ filename

The problem is -p seems to have it loop over the file line by line, and so a 'o' modifier won't any have effect. However without the -p option it doesn't seem to work...

Upvotes: 3

Views: 521

Answers (3)

user2719058
user2719058

Reputation: 2233

A compact way to do this is

perl -i -pe '$done ||= s/old/new/' filename

Upvotes: 6

pobrelkey
pobrelkey

Reputation: 5973

Yet another one-liner:

 perl -i.bak -p -e '$i = s/old/new/ if !$i' filename

Upvotes: 3

codnodder
codnodder

Reputation: 1675

There are probably a large number of perl one liners that will do this, but here is one.

perl -i.bak -p -e '$x++ if $x==0 && s/old/new/;' filename

Upvotes: 2

Related Questions