You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于起止模式复制替换文本块的Perl实现方案求助

解决YAML文本块的搜索复制替换问题

问题需求

需要实现以下文本处理操作:

  • 查找满足两个条件的文本块:以- section:开头,且包含value: "MARKER"
  • 复制找到的文本块,将其中的MARKER替换为NEW MARKER,再追加到原文本块的后方

原命令的问题

你之前使用的命令:

perl -0777 -pe 's/(section:[\s\S]*?"MARKER")/\$1 =~ s/"MARKER"/"NEW MARKER"/gr/e' input.txt

存在两个核心问题:

  1. 匹配范围不完整:正则仅匹配了从section:到第一个MARKER的片段,没有覆盖整个section块(直到下一个- 开头的行)
  2. 替换逻辑错误:该命令是直接替换原块为修改后的内容,而非保留原块并追加修改后的副本

可行解决方案

使用以下Perl命令可实现需求:

perl -0777 -pe 's/(- section:\n(?:  .*\n)+?  value: "MARKER"\n)/$1$1=~s/"MARKER"/"NEW MARKER"/gr/e' input.txt

命令细节解释

  1. -0777:读取整个文件作为单个字符串,支持跨行匹配操作
  2. 正则表达式(- section:\n(?: .*\n)+? value: "MARKER"\n):
    • - section:\n:精准匹配目标section块的起始行
    • (?: .*\n)+?:非捕获组,匹配section块内所有缩进行(示例中缩进为2个空格),+?非贪婪匹配避免误抓多个section块
    • value: "MARKER"\n:匹配包含MARKER的行,确保当前section是目标块
  3. 替换逻辑$1$1=~s/"MARKER"/"NEW MARKER"/gr:
    • $1:保留原section块内容
    • $1=~s/.../gr:对原块执行替换,生成替换后的副本,r选项返回新字符串且不修改原变量
    • /e:允许替换部分执行Perl代码逻辑

效果验证

将该命令应用到你的输入文本后,会生成你期望的输出:每个包含MARKER的section块后方,都会追加一个替换了NEW MARKER的副本,其他section块保持原样。

内容的提问来源于stack exchange,提问作者Carsten

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 06:15:55