命令行中的Perl:在文件中只替换一次regex

时间:2013-11-30 23:54:51

标签: regex perl

我正在尝试替换配置文件中的一行。问题是我只想替换一次出现。部分文件看起来像这样。它是gitolite默认配置文件:

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

# 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",

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

我想从命令行将LOCAL_CODE设置为其他内容。我以为我可以在perl中做到这一点以获得pcre的便利性。我是perl的新手,但无法让它工作。

我发现了这个:

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

问题是-p似乎让它逐行循环遍历文件,因此'o'修饰符不会产生任何影响。但是没有-p选项它似乎不起作用......

3 个答案:

答案 0 :(得分:4)

执行此操作的紧凑方法是

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

答案 1 :(得分:3)

又一个单行:

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

答案 2 :(得分:2)

可能有大量的perl一个衬里​​可以做到这一点,但这里有一个。

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