[英]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.