Perl 脚本:Neet 编写一个基于模式的脚本来使用 perl 替换值

Perl Script: Neet to write a pattern based script to replace the values using perl

提问人:Santhosh 提问时间:11/4/2023 最后编辑:Léa GrisSanthosh 更新时间:11/6/2023 访问量:117

问:

我有一个包含许多网址的测试文件。我所要做的就是编写一个基于模式的perl脚本,每当我看到需要在url中更改为SSSS(value=大写,小写,数字和特殊字符的组合)时。

在我看到数字的那个文件中,我使用以下脚本将其更改为 NNN。

perl -pe 's/(\\/\\d+\\/)/\\/NNN\\//g' | perl -pe 's/(\\/\\/d+$)/\\/NNN/g'

我尝试使用以下脚本将值更改为SSSS,但它无法按预期工作。

sed -E 's#(.\*/(code|catalogue)/)\[^/\]\*#\\1SSSS#' file

使用上面的 sed,我可以改变一些,但它会改变一些我永远不想改变的东西。例如,你可以看到这个

/goods-catalogue-service/v1/api/catalogue/NNN/code/ahvs123/categories

/auction-catalogue-service/v1/api/catalogue/CAT_CMC_KGF_10/catalogue-item/search-category-item

如果您观察到上述两行。我想将 ahvs123 和 CAT_CMC_KGF_10 更改为 SSSS。在这种情况下,在目录之后的第一行中,NNN在那里,它也变成了SSSS,这是我不想要的。

所以只有我更喜欢perl脚本。

perl -pe 's/\[\[A-Za-zA-Z0-9\_\\-\]+/SSSS/g'

我也试过这个,但它正在将整行更改为 SSSS。

有人可以给我推荐一个剧本吗?我附上了一个文件供您参考。

https://drive.google.com/file/d/1Isa34L7hWju5BWsTWOItftwT71zMJsQN/view?usp=sharing

正则表达式 Perl SED

评论

1赞 TLP 11/6/2023
不要在指向外部文件的链接中向问题添加材料。您应该包括一些测试用例:具有预期输出的输入。

答:

0赞 hata 11/4/2023 #1

您可以使用正则表达式的负前瞻(?!)

open(TEXT, "<test.txt");
my @lines = <TEXT>;
close(TEXT);

foreach my $line (@lines) {
    $line =~ s/\/catalogue\/([^\/]+)\/(?!(code\/|.+?\/code\/))/\/catalogue\/SSSS\//;
    $line =~ s/\/code\/([^\/]+)\//\/code\/SSSS\//;
    print $line;
}

评论

0赞 Santhosh 11/6/2023
我需要用“<TEXT>;”替换的内容
0赞 tripleee 11/6/2023
这不是你想要取代的东西。它说通过此名称从文件句柄中读取行。也许您想修改它附加到的文件名,这是上一行调用的第二个参数。open
0赞 Santhosh 11/6/2023
@triplee我收到这样的错误。 [root@web1 URL]$ cat script.sh file=“/tmp/URLs/test.txt” open(TEXT, “<file”);我的@lines = <文本>;close(文本);foreach my $line (@lines) { $line =~ s/\/catalogue\/([^\/]+)\/(?!(代码\/|.+?\/code\/))/\/catalogue\/SSSS\//;$line =~ s/\/code\/([^\/]+)\//\/code\/SSSS\//;打印$line;} [root@web1 URLs]$ ./script.sh ./script.sh:第 2 行:意外令牌打开附近出现语法错误(TEXT, “<file”);'TEXT,' ./script.sh: line 2:
1赞 tshiono 11/8/2023
@Santhosh,您将代码作为脚本运行。在脚本的顶部放置一个 shebang 行,类似于(系统中 perl 解释器的路径)。sh#!/usr/bin/perl
1赞 Santhosh 11/8/2023
@tshiono 我明白了谢谢