首页 > 解决方案 > sed 多行搜索替换

问题描述

我得到了令人讨厌的旧语法的 fortran 代码,并想移植到新语法。我的sed命令

sed -nr 'N;s/\n\s*\d\D\s*//g' file 

应该找到编号的换行符,但由于我不知道的原因不起作用。我已经在sed这里查看了许多多行问题,但我仍然无法解决我的误解。据我了解,该命令的工作方式如下:

N                   append next line to pattern space; thus pattern space has two lines with \n in between
s///g               usual search-replace
\n\s*\d\D\s*        matches a newline followed by \s*, a digit, a non-digit and a \s* again

代码看起来像

   if(condition) then 
         call func1(v1, v2, v3, v4
     1              ,v5,v6,v7)
      else
         call func2(v1, v2, v3, v4
     1              ,v5,v6,v7)
      endif
call MPI_BCAST(num(1),1,MPI_DOUBLE_PRECISION
     1     ,masterid,comm,mpinfo)
21      format(' text',2x,f10.5)

并应转换为目标代码

   if(condition) then 
         call func1(v1, v2, v3, v4,v5,v6,v7)
      else
         call func2(v1, v2, v3, v4,v5,v6,v7)
      endif
call MPI_BCAST(num(1),1,MPI_DOUBLE_PRECISION,masterid,comm,mpinfo)
21      format(' text',2x,f10.5)

标签: regexsedreplacemultiline

解决方案


这可能对您有用(GNU sed):

sed -E ':a;N;s/\n\s*[0-9]\s*([^0-9])/\1/;ta;P;D' file

使用 2 行窗口遍历文件。

如果第二行以一些或没有空格开始,然后是一个数字,然后是一些更多或没有空格,然后是一个非数字,用非数字替换它并重复。否则打印窗口的第一行,然后将其删除并重复。


推荐阅读