【问题标题】:find a string in a word and replace the complete word with another in perl在一个单词中找到一个字符串并用perl中的另一个替换完整的单词
【发布时间】:2015-01-05 17:38:57
【问题描述】:

我想在一个单词中找到一个字符串,然后用 perl 中的另一个字符串替换整个单词。

例如:我有以下字符串。

my $str =

<schedule environment="sit">
<hours>SIT_HR</hours>
</schedule> 
<schedule environment="uat">
<hours>UAT_HR</hours>
</schedule>
<schedule environment="prd">  
<hours>PRD_HR</hours>
</schedule>

我必须找到 *_HR 并将其替换为 60。

输出:

<schedule environment="sit">
<hours>60</hours>
</schedule> 
<schedule environment="uat">
<hours>60</hours>
</schedule>
<schedule environment="prd">  
<hours>60</hours>
</schedule>

【问题讨论】:

标签: regex perl


【解决方案1】:

您的输入看起来像一个没有根标记的 XML。

我添加了根标签并使用xsh 处理文件,这是XML::LibXML 的包装器:

open file.xml ;
for /root/schedule/hours {
    if xsh:matches(., '_HR$' ) set . 60 ;
}
save :b ;

【讨论】:

    【解决方案2】:

    试试这个。我不擅长 XML。但我完成了你所期望的输出。

    use warnings;
    use strict;
    open('file',"file.xml");
    my @file = <file>;
    print @file if grep{s/.{3}_HR/60/g} @file;
    

    在这里,我将file.xml 存储到数组@file 中。

    grep 用于在数组中查找单词。

    然后是用于替换数组中的字符串的替换。

    【讨论】:

    • 事实上,它有效,对不起。但是,@replace 的用途是什么?为什么使用'file' 作为文件处理程序而不是词法处理程序?如果一行中有多个xxx_HR,则不起作用。
    • @M42 感谢您记录我的错误。我编辑了我的答案。自己试试。这也可以在一行中提供正确的输出。文件处理程序使用了任何名称,所以我只使用了file。如果您对我编辑的问题有任何疑问,请添加评论
    猜你喜欢
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2023-04-03
    • 2021-01-22
    • 2017-11-03
    • 2017-11-14
    相关资源
    最近更新 更多