【问题标题】:Grep and Replace a string in a particular patternGrep 和替换特定模式中的字符串
【发布时间】:2020-03-06 20:21:24
【问题描述】:

我想以特定模式添加/替换文件中的字符串。请参考以下内容

"dont_search_this"   => {
    -tag => "qwerty",
    -abc_asd => [ "q/rg/dfg.txt",],
    -dependent_fcv => ["me_lib",  "you_lib",], 
    -vlog_opts => (($ENV{ABC_PROJECT}) eq "xuv")
      ? [ "-error=AMR", "-error=GHJ", "-error=TYU", "-error=IJK", ]
      : [] ,
},

"search_this"   => {
    -tag => "qwerty",
    -abc_asd => [ "q/rg/dfg.txt",],
    -dependent_fcv => ["me_lib",  "you_lib",], 
    -vlog_opts => (($ENV{ABC_PROJECT}) eq "xuv")
      ? [ "-error=AMR", "-error=GHJ", "-error=TYU", "-error=IJK", ]
      :[],
},

在上述数据中,我只想在 search_this 段落的 -vlog_opts 行中添加字符串“-error=all”。修改应该如下

"dont_search_this"   => {
    -tag => "qwerty",
    -abc_asd => [ "q/rg/dfg.txt",],
    -dependent_fcv => ["me_lib",  "you_lib",], 
    -vlog_opts => (($ENV{ABC_PROJECT}) eq "xuv")
      ? [ "-error=AMR", "-error=GHJ", "-error=TYU", "-error=IJK", ]
      :[],
},

"search_this"   => {
    -tag => "qwerty",
    -abc_asd => [ "q/rg/dfg.txt",],
    -dependent_fcv => ["me_lib",  "you_lib",], 
    -vlog_opts => (($ENV{ABC_PROJECT}) eq "xuv")
      ? [ "-error=AMR", "-error=GHJ", "-error=TYU", "-error=IJK", "-error=all" ]
      :[],
},

请帮助我。 使用 perl 也可以。

非常感谢!

【问题讨论】:

  • "使用 perl 也可以" -- 那么你使用的是什么?还是您只是要求某人为您写它?这是在 Perl 程序中(它是有效的 Perl),还是在文本文件中(如它所说)?
  • 这是一个脚本文件,需要修改(视为文本)。
  • 一个提醒,看看What should I do when someone answers my question? 如果事情仍然没有解决或清楚,请告诉我们

标签: string perl sed replace grep


【解决方案1】:

我忍不住想,一定有比编辑源代码更好的方法...?

将整个脚本文件读入一个字符串,然后根据线索确定要更改的地方

perl -0777 -wpe'
    s/"search_this"\s+=>\s+\{.*?\-vlog_opts\s+=>\s+[^\]]+\K/ADD_THIS/s; 
' file

(为了便于阅读,换行)

注意事项

  • 0777switch 取消设置input record separator,因此文件被“slurped”为一个“行”

  • /s modifier 使得. 也匹配换行符

  • \K 使得到该点的所有匹配都被丢弃(不消耗),因此它们不必(捕获和)输入到替换部件中。所以我们从字面上添加ADD_THIS

  • 关于 \K 的有用信息在“Lookaround Assertionsin Extended Patterns in perlre 下,但请记住,它与其他 Lookaround 略有不同

【讨论】:

    【解决方案2】:

    这看起来像一个 perl 数据结构。

    任何不能将"-error=all" 推入$hash{search_this}{-vlog_opts}->@* 的原因

    【讨论】:

    • 这是一个脚本文件,需要修改(视为文本)
    猜你喜欢
    • 1970-01-01
    • 2020-11-22
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 2014-01-13
    • 2018-02-24
    相关资源
    最近更新 更多