【问题标题】:Perl replace string in filePerl替换文件中的字符串
【发布时间】:2020-07-23 03:45:50
【问题描述】:

我正在尝试提示用户输入输入并将文件中的某些属性替换为输入。这是行不通的。 abc.txt 包含“NA”行,我希望用“user_input”替换。有什么帮助吗?谢谢

use strict;
use warnings;

my $x = "<process>NA</process>";
print "Please specify process used\n";
my $process = <STDIN>;
chomp $process;

open(XML, "<", "abc.txt") or die "Couldn't open file, $!";
while(<XML>){

    s/<process>NA</process>/<process>$process</process>/g;  
}

【问题讨论】:

  • 你应该在你的正则表达式中转义像'/'这样的符号。或者使用 s#source#destination#g 格式
  • 感谢您的建议工具。我发现 XML::LibXML 模块更好。现在可以了。

标签: file perl replace


【解决方案1】:

@Blurman,如果您使用某种 /bin/sh,您可以使用 perl 的 inplace 选项和单线:

echo -n 'process ? ';read p; perl -pi -e "s,<process>[^<]*</process>,<process>$p</process>,g" abc.txt

哦,顺便说一句,我更改了 NA[^&lt;]* 以允许多次连续运行;)

+米歇尔

【讨论】:

    【解决方案2】:

    您的代码的主要部分在这里:

    open(XML, "<", "abc.txt") or die "Couldn't open file, $!";
    while(<XML>){
      s/<process>NA</process>/<process>$process</process>/g;  
    }
    

    这里有两个主要问题会阻止你的代码做你想做的事情。

    • 您的替换运算符的匹配模式和替换字符串中有/ 字符。这意味着您的代码甚至无法编译。如果您的数据中有/ 字符,那么最好的选择是使用不同的字符作为替换运算符的分隔符。

      s|<process>NA</process>|<process>$process</process>|g;
      
    • 您更改了数据(存储在 $_ 中),但您对更改后的版本没有任何操作。您需要将更改后的数据版本写回文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-21
      • 2013-07-17
      • 1970-01-01
      • 2016-08-02
      • 2014-10-06
      • 2013-07-13
      相关资源
      最近更新 更多