使用正则表达式替换基于旧数字的新数字的字符串

时间:2015-11-06 19:39:23

标签: mysql regex perl awk

我想出了这个正则表达式

[0-9]+:"https:\/\/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\/

匹配此数据

...
21:"https://10.0.0.0/blah"
...

我最想要的是

...
4:"blah"
...

其中减去的金额是https://部分的长度。要减去的数字是不变的,即IP地址总是相同的,所以我正在寻找某种替代方式,比如伪正则表达式

s|[0-9]+:"https:\/\/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\/|($1-17):"|g

其中17是长度,但我无法想出能够执行此操作的内容。我想我需要其中一个神奇的perl one liners。这些数据也都在MySQL数据库中,因此我可以在SQL中做正确的事情,但对分组选项不熟悉,以及在SQL中是否可以使用算法。

我也明白正则表达式不能做算术(除了那个神奇的算法)

也许AWK最适合这个?我之前从未使用过AWK,所以需要做一些阅读

2 个答案:

答案 0 :(得分:2)

您正在寻找的是:

perl -pe 's{^(\d+)(:")(https://[\d.]+/)}{ ($1 - length($3)) . $2 }e' file

键是e修饰符,用于评估替换部分中的代码。

答案 1 :(得分:0)

awk救援!

$ awk -v FS="[:\"/]" '/[0-9]+:"https:\/\/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\// 
{print $1-17 ":\"" $(NF-1) "\"" }' file
4:"blah"