【问题标题】:Replacing multiple occurrences of a char between two string patterns在两个字符串模式之间替换多次出现的字符
【发布时间】:2018-09-12 18:50:20
【问题描述】:

我有一个文件 1.txt,内容如下

F1,F2,[as1,as2],[as3,as4]

F3,F4,F5,[as5,as6]

我需要在 perl 中编写一个正则表达式,以便将 [' and '] 之间的分隔符 ',' 更改为 |

我在下面尝试过,但没有成功。

@qr = $st = /\{(.*)(\|)+\}/;

$st 有输入字符串。

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    对于早于 Perl 5.14 的 Perl 版本,您只能使用类似的正则表达式

    echo "[as1,as2,as3],[as4,as5]" | perl -lpe 's/(?:\[|\G(?!^))[^]]*?\K,/|/g'
    

    请参阅online demo

    模式详情

    • (?:\[|\G(?!^)) - 文字 [ 或上一场比赛的结束 (\G(?!^))
    • [^]]*? - 匹配除] 之外的零个或多个字符,尽可能少地匹配
    • \K - 整个匹配值被丢弃
    • , - 匹配中的逗号(替换为 |)。

    对于 Perl 版本 5.14 和更高版本(出现r 修饰符的位置),您可以将[...] 子字符串与\[[^][]+] 正则表达式匹配(匹配[,然后是1+ 个字符)比[],然后]) 并在这些匹配项中执行替换:

    echo "F1,F2,[as1,as2],[as3,as4]" | perl -lpe 's/(\[[^][]+])/$1=~s#,#|#gr/ge'
    # => F1,F2,[as1|as2],[as3|as4]
    

    请参阅online demo

    【讨论】:

    • @teser:你看过我的演示吗? 期望什么输出? “It-did-not-work”无助于理解如何它应该如何工作。
    • 我很抱歉。我收到以下错误。 Bareword 在 2.pl 第 18 行的“s#,#|#gr”附近找到操作员预期的位置
    • 此问题与您在您的代码中使用解决方案的方式有关,请参阅this answer
    • perl -lpe 's/([[^][]+])/$1=~s/,/|/' str.txt 其中 str.txt 有输入。但是输出不正确
    • 您不应在替换部分中使用相同的正则表达式分隔符。在我的示例中使用#。或者用{...} 括起来。但请务必使用与我上面示例中相同的修饰符。我看到你从正则表达式中删除了它们。看看this demo
    【解决方案2】:

    一个简单的单线可以解决你的任务:

    输入:

    F1,F2,[as1,as2],[as3,as4]
    
    F3,F4,F5,[as5,as6]
    

    perl -lpe 's/\[(.*?),(.*?)\]/[$1|$2]/g' file

    输出:

    F1,F2,[as1|as2],[as3|as4]
    
    F3,F4,F5,[as5|as6]
    

    【讨论】:

      猜你喜欢
      • 2018-06-14
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多