【问题标题】:Replacing a string with a new number based on the old one using regex使用正则表达式将字符串替换为基于旧数字的新数字
【发布时间】:2016-02-08 01:11:59
【问题描述】:

我想出了这个正则表达式

[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 衬里。这些数据也都在 MySQL 数据库中,所以我可以在 SQL 中做一些正确的事情,但对分组选项以及是否可以在 SQL 中进行算术运算不够熟悉。

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

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

【问题讨论】:

  • 在 Perl 中,替换表达式可以是 Perl 代码:s{...}{ ($1-21).':"' }e(其他语言也有类似的功能。)
  • 你能解释一下为什么 42 变成 15 吗?
  • @ThisSuitIsBlackNot,他想减去 21,从他解决这个问题的尝试中可以看出。 ...等等,这会将 42 变成 21,而不是 15?!
  • @ikegami 42 - 21 = 21。编辑:你抓住了它。
  • 比较简单的方法是反序列化数据、修改值、序列化数据和更新行。这不是一个选择吗?

标签: mysql regex perl awk


【解决方案1】:

你要找的是这个:

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

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

【讨论】:

    【解决方案2】:

    awk 来救援!

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      • 2012-04-26
      • 2012-11-07
      • 2015-11-03
      • 1970-01-01
      相关资源
      最近更新 更多