【问题标题】:Need to replace part of a string with another string需要用另一个字符串替换部分字符串
【发布时间】:2011-10-08 22:22:16
【问题描述】:

我对 perl 和 regex 还是很陌生,需要一些帮助才能开始。我很想提供一些代码,但这有点卡住了。

我想要做的是我在这样的文件中有这个字符串:

dn: CN=doe\, john,OU=Users,DC=domain,DC=com

还有这样的字符串:

uid: d12345

我需要进行搜索和替换才能得到以下结果。

dn: uid= d12345,OU=Users,DC=domain,DC=com

谁能帮我开始这个?非常感谢!

【问题讨论】:

  • 你们都回答了我的问题,但我不确定要接受哪个答案,所以我只接受了第一个。不确定那个协议...

标签: regex perl


【解决方案1】:

所以你想用uid= d12345 替换CN=doe\, john?试试这个:

$uidString = "uid: d12345";
$dnString = "dn: uid= d12345,OU=Users,DC=domain,DC=com";

if( $uidString =~ /uid: (\w+)/ ) {
  $uid = $1;
  $dnString =~ s/CN=.+?[^\\],/uid= $uid,/;
}

这将用 uid 替换从 CN= 到第一个未转义逗号的所有内容。

【讨论】:

  • uid 值是动态的,所以不一定是 d+5 位,所以不能匹配 5 位。可能是 b123xyz、pin789abc 等。感谢您的快速响应!
  • 好的,我把它改成\w+,这样会匹配尽可能多的字母数字字符。
【解决方案2】:

单行正则表达式不能解决问题吗?

use strict;
use warnings;

my $a = "dn: CN=doe\, john,OU=Users,DC=domain,DC=com";
my $b= "uid: d12345";
#the regex
$a =~ s/CN(.*?), .*?,/$b,/;

print "$a";

【讨论】:

    【解决方案3】:

    我怀疑您的 DN 和 uid 将是动态的。这里有一些会有所帮助的东西。正则表达式将一直替换 CN=,直到逗号替换为您在 $uid 中输入的任何字符串。

    #!/usr/bin/env perl
    
    use strict;
    use warnings;
    
    my $string = 'dn: CN=doe\, john,OU=Users,DC=domain,DC=com';
    my $uid_str  = 'uid: d12345';
    my ($uid) = $uid_str =~ m/^uid:(.+)$/;
    $string =~ s/CN=.+(,OU=.+$)/uid=$uid$1/;
    
    print "String is: $string\n";
    

    输出:String is: dn: uid= d12345,OU=Users,DC=domain,DC=com

    【讨论】:

    • 输出应如下所示: dn: uid= d12345,OU=Users,DC=domain,DC=com 您能否帮助解释一下正则表达式以帮助我更好地理解?非常感谢!
    • 抱歉,我还在学习如何正确编辑我的帖子。 :(
    • 更新了更正确的输出。此正则表达式将查找文字字符串 CN= 及其后面的任何字符,直到找到逗号和字符串 OU=。它将使用提供的 uid 替换从 CN= 到 ,OU 的所有内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 2022-12-28
    • 2011-08-10
    • 2019-09-26
    相关资源
    最近更新 更多