簡體   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