提问人:Santhosh 提问时间:11/4/2023 最后编辑:Léa GrisSanthosh 更新时间:11/6/2023 访问量:117
Perl 脚本:Neet 编写一个基于模式的脚本来使用 perl 替换值
Perl Script: Neet to write a pattern based script to replace the values using perl
问:
我有一个包含许多网址的测试文件。我所要做的就是编写一个基于模式的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
答:
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 我明白了谢谢
评论