用单个字符串替换模式之间的线条

时间:2017-01-06 13:28:50

标签: bash replace sed

我有这个文件,我想继续工作:

{'ID1': {'Zero': u'value',
               'One': 'value',
               'Two': 'value',
               'Three': 'value',
               'Four': 'value'},
 'ID2': {'Zero': u'alue',
               'One': 'value',
               'Two': 'value',
               'Three': 'value',
               'Four': 'value'})

我有这个sed衬垫来获得单一属性:

sed -n '/ID1.*{/,/}/p' file

那会给我这个:

{'ID1': {'Zero': u'value',
               'One': 'value',
               'Two': 'value',
               'Three': 'value',
               'Four': 'value'}

我想要做的是用STRING替换输出

无法弄清楚如何。

1 个答案:

答案 0 :(得分:0)

p替换为{/}/!d;s/.*/STRING/p}

而不是打印每个匹配的行:

  • /}/!d删除不包含}的行。 (包含范围的END模式)

  • s/.*/STRING/p用STRING

  • 替换整行
  • 最后,上述操作之后:p打印范围之外的任何其他内容

完整命令,粗体括号范围内的操作:

  

sed -n '/ID1.*{/,/}/ { /}/!d;s/.*/STRING/p } ;p' file

输出:

STRING 
 'ID2': {'Zero': u'alue',
               'One': 'value',
               'Two': 'value',
               'Three': 'value',
               'Four': 'value'})

你知道,我确信,这在很大程度上取决于你的JSON的格式......你不能拥有任何嵌套的{}。不过,这是一个值得讨论的问题,因为尝试使用i命令进行插入会变得很愚蠢,线条笨重的线条延续。