如何解决尽管似乎可以在在线测试仪上运行,但 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 举报,一经查实,本站将立刻删除。