【问题标题】:grep + sed to replace characters surrounding a stringgrep + sed 替换字符串周围的字符
【发布时间】:2014-05-09 16:49:13
【问题描述】:

我希望通过文件夹递归并将所有出现的{{text in here}} 替换为%{text in here}

我检查了其他 grep+sed 主题,但它们通常与标准字符串替换有关;我想保持字符串完整,但替换字符串周围的一些字符(基本上用%替换第一个左大括号并删除第二个右大括号)。

【问题讨论】:

    标签: string sed grep


    【解决方案1】:

    除非您出于某种原因必须使用sed,否则 Perl 几乎总是更可取的,因为它的正则表达式语法更简洁、更强大:

    find ... | xargs perl -i~ -pe 's/{{(.*?)}}/%{$1}/g'
    

    此外,尽管-i~ 创建了备份,但我强烈建议您在尝试此操作之前备份整个树。我无法计算通过两次运行损坏的命令行来擦除工作的次数。最常见的错误是不小心使用-ne 而不是-pe,这会导致所有数据都从原件中删除。再次运行它会将备份替换为新清空的文件,让您只剩下一种在胃里下沉的感觉。

    【讨论】:

    • @kzh:在 Linux/GNU 上,是的。在 BSD/Mac 上,它是 -E。这是我更喜欢 Perl 的另一个原因。
    • 接受的答案无法正常工作...如上面的 cmets 所述。这个可以。
    【解决方案2】:

    试试像s/{{\(.*\)}}/%{\1}/这样的正则表达式

    第二个字符串中的

    \1 被第一个 (...) 对的内容替换

    【讨论】:

    • 这会将{{abc}} def {{ghi}} 替换为%{abc}} def {{ghi}。
    • 我实际上找到了一些我想要的东西(并且正则表达式与您提供的相同,尽管解决方案是 ruby​​)。谢谢!
    【解决方案3】:

    这行得通吗?

    sed 's/{{/%{/g;s/}}/}/g' inputfile
    

    或

    sed 's/{{\([^}]*\)}}/%{\1}/g' inputfile
    

    【讨论】:

    • 假设(应该是这样){{ 和 }} 之间没有 },所以如果 Alex 假设这是一个非常简单和好的解决方案
    【解决方案4】:

    使用临时字符允许排除 ([^³])。这假设里面没有³ 和²。几乎任何其他字符都可以通过第一次检查/替换来使用或保护它,但标准内容通常不需要。

    sed -e 's/{{/²/g;s/}}/³/g;s/²\([^³]*\)³/%{\1}/g;s/²/{{/g;s/³/}}/g' YourFile
    

    在 KSH/posix sed 上

    echo "{{abc}} def {{ghi}} jkl {{ mno } {{pqr}}" | sed -e 's/{{/²/g;s/}}/³/g;s/²\([^³]*\)³/%{\1}/g;s/²/{{/g;s/³/}}/g'
    
    %{abc} def %{ghi} jkl %{ mno } {{pqr}
    

    注意{{ mno } {{pqr}} 上的最后一个封装行为

    【讨论】:

      猜你喜欢
      • 2014-01-13
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 2020-03-13
      • 2012-10-09
      • 2016-03-01
      • 2011-09-04
      • 1970-01-01
      相关资源
      最近更新 更多