每当文件中的字符串匹配时合并行

每当文件中的字符串匹配时合并行

每当在文件中找到特定字符串时,我想合并两行。

输入示例:

{
    id: 23281598
      total: {
        value: 3.0
      }
      isThin: false
      raw: {
        value: 6.0
      }
    }
    total: {
      value: 1.401326182E9
    }
    Pools: {
      value: 8.98886247E8

期望的输出:

{
    id: 23281598
      total: { value: 3.0
      }
      isThin: false
      raw: { value: 6.0
      }
    }
    total: { value: 1.401326182E9
    }
    Pools: { value: 8.98886247E8

正如您所注意到的,每当我找到该模式时,value:我都想将其与文件中的前一行组合起来。如果你删除每行中的前导空格,我就可以了。我需要awksed解决方案。输入文件中没有固定模式。包含的行value:可能出现在任何地方,但不会连续出现。

使用Solaris 5.10。

答案1

正面:

LC_ALL=C sed -e '$!N;/value:/b1' -e 'P;D' -e:1 -e 's/\n[[:space:]]*/ /' <file

很简单:

  • $!N:除了最后一行之外的每一行,读取下一行
  • /value:/b1:如果模式匹配,则转到名为的分支1
  • P;D:如果模式不匹配,则打印当前行,从$!N上面读取行开始新的循环。因此,如果有line1\nline2,则打印line1,用 开始新的循环line2$!N使其成为line2\nline3等等。
  • :1:定义名为的分支1
  • 's/\n[[:space:]]*/ /':在分支中1,将嵌入的换行符和前导空格替换为一个空格。

答案2

把事情简单化:

sed 'N;s/\n[[:space:]]*value:/ value:/;P;D'

执行一个N;P;D循环,始终同时处理两行($!顺便说一下,这里不需要)。在里面,用空格替换换行符,然后value:用一个空格替换。就是这样。

答案3

sed您也可以尝试使用

sed -e '/: {$/{N;s/\n//g}' -e 's/{.*v/{ v/g' file

解释:

  • /启动条件
  • : {$如果行结尾为: {
  • /结束条件
  • {启动操作组
  • N;将下面的行连接到匹配行
  • s/\n//g使替换\n
  • }结束操作组

格式化输出可选

  • 's/{.*v/{ v/g'执行其他表达式,将{& v(空格)之间的所有内容替换为一个空格

据我了解,solaris 不支持-i选项,因此您必须对输出进行重定向才能进行更改。

试一下

相关内容