微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尽管似乎可以在在线测试仪上运行,但 Perl 正则表达式并未替换

如何解决尽管似乎可以在在线测试仪上运行,但 Perl 正则表达式并未替换

我已经构建了以下正则表达式:

(public\s\$log_path\s=\s'\/var\/www\/)(.*?)(?=\/)(.*)

我想匹配下面配置文件中的 public $log_path 行并使用以下模式替换它:

$1test/$2$3

哪个应该给我:

public $log_path = '/var/www/test/administrator/logs';

我的 Perl 单行是: perl -pe "s/(public\s\$log_path\s=\s'\/var\/www\/)(.*?)(?=\/)(.*)/$1test$2$3/" <file-name>.PHP

但这似乎并没有改变任何东西,只是将文件打印回控制台。

文件内容如下:

<?PHP
class JConfig {
    public $MetaAuthor = '1';
    public $MetaDesc = '';
    public $MetaKeys = '';
    public $MetaRights = '';
    public $MetaTitle = '1';
    public $MetaVersion = '0';
    public $access = '1';
    public $cache_handler = 'file';
    public $cachetime = '15';
    public $caching = '0';
    public $captcha = '0';
    public $cookie_domain = '';
    public $cookie_path = '';
    public $log_path = '/var/www/website/administrator/logs';
}

有什么关于我哪里出错的提示吗?

解决方法

使用单引号并定义双引号之间的单引号:

perl -pe 's/(public\s\$log_path\s=\s'"'"'\/var\/www\/)(.*?)(?=\/)(.*)/$1test$2$3/' <file-name>.php
,

您肯定会被 shell 引用所困扰,这在最好的情况下可能会令人讨厌。这适用于 Bash:

[1] "360/26" "360/44" "362/66" "363/72" "364/90"
[6] "364/92"

它通过在 Perl 替换中使用备用分隔符简化了前斜线的转义,并且我通过匹配该位置的任何内容来欺骗单引号的匹配。

perl -pe 's{^(\s*public\s+\$log_path\s+=\s+./var/www)/}{$1/test/};' test.php

如果您确实必须匹配该位置的单引号,您可以按照@Ryszard Czech 的建议进行操作并将它们放在双引号中:

</tmp> $ cat test.php
<?php
class JConfig {
    public $MetaAuthor = '1';
    public $MetaDesc = '';
    public $MetaKeys = '';
    public $MetaRights = '';
    public $MetaTitle = '1';
    public $MetaVersion = '0';
    public $access = '1';
    public $cache_handler = 'file';
    public $cachetime = '15';
    public $caching = '0';
    public $captcha = '0';
    public $cookie_domain = '';
    public $cookie_path = '';
    public $log_path = '/var/www/website/administrator/logs';
}

</tmp> $ perl -pe 's{^(\s*public\s+\$log_path\s+=\s+./var/www)/}{$1/test/};' test.php
<?php
class JConfig {
    public $MetaAuthor = '1';
    public $MetaDesc = '';
    public $MetaKeys = '';
    public $MetaRights = '';
    public $MetaTitle = '1';
    public $MetaVersion = '0';
    public $access = '1';
    public $cache_handler = 'file';
    public $cachetime = '15';
    public $caching = '0';
    public $captcha = '0';
    public $cookie_domain = '';
    public $cookie_path = '';
    public $log_path = '/var/www/test/website/administrator/logs';
}

对于这样的事情,我发现最好先让它在 shell 脚本中工作,然后再尝试将其转换为单行;你不是在与正则表达式和 shell 以这种方式同时引用两者作斗争。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?