【问题标题】:Replace every matching string by another one in every line beginning with a pattern在以模式开头的每一行中用另一个匹配的字符串替换每个匹配的字符串
【发布时间】:2015-09-23 09:13:40
【问题描述】:

上下文

包含需要更新的代码的大型 ruby​​ 项目。由于匹配结果的数量很重要,我想进行大量搜索并用正则表达式替换。

问题

鉴于在各种 ruby​​ 文件中精心挑选的这些可能的字符串:

Resque.enqueue Layers::ReprocessLayers, item.id, true
Resque.enqueue_in 1.days, Backoffice::DeleteS3File, "much-bucket", new_file.key
Resque.enqueue OrderManagement::ReprocessOrder, params[:id]
Resque.enqueue OrderManagement::ReprocessItem, order.id, item.id

对于以Resque 开头的所有字符串,我想将所有匹配的.id 替换为.id.to_sResque 关键字之前很可能有空格。

【问题讨论】:

    标签: regex sed


    【解决方案1】:

    你可以使用这个 sed 命令:

    sed '/^[[:blank:]]*Resque/s/\.id/&.to_s/g' file
    

    模式分解:

    /^[[:blank:]]*Resque/  # match lines starting with whitespaces and Resque
    s/\.id/&.to_s/g        # replace .id with .id_.to_s
    

    【讨论】:

    • 也许打开-i
    • Resque ....,bad.idea,false' 应该提供一些安全性或所有.id 都可以(就像 OP 一样作为约束,但不确定一切都在这个约束中)
    • ok sed -i.bak '/^[[:blank:]]*Resque/s/\.id\>/&.to_s/g' file 可用于.id之后的字边界断言
    • @NeronLeVelu:好点,但我不必处理这些限制
    • 对不起,我没明白。这确实是一个正则表达式解决方案,但您必须使用一些工具来运行您的正则表达式,sed 就是这里的工具。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多