AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 481073
Accepted
Inian
Inian
Asked: 2018-11-12 03:01:09 +0800 CST2018-11-12 03:01:09 +0800 CST 2018-11-12 03:01:09 +0800 CST

Perl 命令行正则表达式修改所有模式匹配

  • 772

我正在尝试对perl命令行中的匹配模式使用一些算术。我能够为一场比赛做到这一点,但不是全部。

str="a1b2c3"
perl -pe 's/\d+/$&+1/e'  <<<"$str"
a2b2c3

我理解这里$&指的是第一个匹配的数字1。我需要做什么才能添加1到所有数字?是否有一个类似于$&代表所有匹配模式的变量?或者需要修改正则表达式以匹配多个数字。

对于给定的输入,我期望输出类似于

a2b3c4
regular-expression command-line
  • 2 2 个回答
  • 1804 Views

2 个回答

  • Voted
  1. Best Answer
    Kusalananda
    2018-11-12T03:25:44+08:002018-11-12T03:25:44+08:00
    str="a1b2c3"
    perl -pe 's/\d+/$&+1/ge' <<<"$str"
    

    g替换标志将使 Perl 为输入行上的每个非重叠匹配应用表达式。

    Nitpick:这里实际上没有涉及捕获组(原始问题提到了捕获组)。Perl 变量$&是“由最后一次成功的模式匹配匹配的字符串”。这与引用对应捕获组匹配的字符串(带括号的表达式)的 eg 等$1不同。$2中没有捕获组\d+,但您可以s/(\d+)/$1+1/ge改用它,它确实使用单个捕获组。

    s/(\d+)/$1+1/ge结果和结果之间没有区别s/\d+/$&+1/ge。在这个简短的内嵌 Perl 脚本中,您选择使用其中一个没有区别,但通常您希望避免$&在执行许多正则表达式操作的较长 Perl 程序中使用,至少在使用较旧的 Perl 时发布。

    来自perldoc perlvar(我的重点):

    性能问题

    传统上,在 Perl 中,任何使用三个变量中的任何一个$`,$&或$' (或它们的use English等价物)在代码中的任何地方,都会导致所有后续成功的模式匹配复制匹配的字符串,以防代码随后访问这些变量之一. 这对整个程序造成了相当大的性能损失,因此通常不鼓励使用这些变量。

    [...]

    在 Perl 5.20.0 中,默认启用了一个新的写时复制系统,它最终修复了这三个变量的所有性能问题,并使它们在任何地方都可以安全使用。

    • 10
  2. Stéphane Chazelas
    2018-11-12T05:04:07+08:002018-11-12T05:04:07+08:00

    如果您实际使用的是zshshell (<<<是一个非标准运算符,它确实来自zsh,但此后已被复制到其他几个 shell 中),请注意您不需要为此调用perl。

    你可以做:

    set -o extendedglob # for (#m) below
    printf '%s\n' ${str//(#m)<->/$((MATCH+1))}
    

    在哪里

    • (#m)打开整个比赛的捕获$MATCH(相当于perl's $&)
    • <-> 匹配任何十进制数字序列(就像<5-12>但没有任何限制)。
    • 2

相关问题

  • 需要许多参数的实用程序的推荐界面是什么?[关闭]

  • 远程运行 X 应用程序,在远程主机上运行 GUI [关闭]

  • 更少:使用 AND 的多个过滤条件

  • 使 mysql CLI 以交互方式向我询问密码

  • 没有服务器的命令行 pub/sub?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve