繁体   English   中英

sed 多行搜索替换

[英]sed multiline search-replace

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

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

应该找到编号的换行符,但由于我不知道的原因而不起作用。 我已经在numberous multiline-看看sed的问题在这里,我仍然不能FID我的误解。 根据我的理解,该命令的工作方式如下:

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)

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

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

使用 2 行窗口遍历文件。

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

这是一种适用于给定示例输入的perl解决方案:

perl -0777 -pe 's/\n\h*\d\h*(?=,)//g'
  • -0777整个输入作为单个字符串
  • \\n\\h*\\d\\h*匹配换行符后跟可选水平空格后跟数字字符后跟可选水平空格
    • (?=,)仅当此类匹配后有逗号字符时才匹配...否则,您需要说明如何不匹配21 format(' text',2x,f10.5)

使用GNU sed ,但我对这些命令的理解还不够自信:

sed -E 'N; s/\n\s*[0-9]\s*,/,/; P; D'

来自GNU sed 手册

P打印出直到第一个换行符的模式空间部分。

D如果模式空间不包含换行符,则开始一个正常的新循环,就像发出了 d 命令一样。 否则,删除模式空间中直到第一个换行符的文本,并使用结果模式空间重新开始循环,而不读取新的输入行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM