我正在嘗試修改幾個檔案中的幾行塊。最初,我嘗試了 sed,但讀到 Perl 可能是更好的選擇。但是,我的 Perl 非常基礎,我不確定如何處理空(新)行和特殊字符“/”。總而言之,我想要一個像 ( $perl -i -pe ...) 這樣的單線來轉換
(new line)
#include <item_b/item_bC.h>
進入
#include <item_a/item_aC.h>
#include <item_b/item_bC.h>
謝謝。
uj5u.com熱心網友回復:
一種方法 - 將檔案放入字串中,然后匹配僅可能有空格的行,后跟以 開頭的行#include...,并替換與該#include行匹配的內容兩次
perl -0777 -wpe's{ ^\s*\n ( \#include.*\n ) }{$1$1}mxg' file.c
有了-0777它吸食整個檔案到$_與-p它列印$_在每一行(只有一次,下-0777自興田整個檔案是$_如此,只有一個“線”); 請參閱perlrun 中的開關。所述/m改性劑品牌^(和$)也是一個(多)字串內匹配線邊界。
或者,使用相同的一般方法(slurp 檔案)但使用前瞻
perl -0777 -wpe's{ ^\s*\n (?= (\#include.*\n) ) }{$1}mxg' file.c
匹配一個空行,然后先行查找以 開頭的行#include,該行也被捕獲,以便用它替換空行。由于環視不消耗任何東西,因此無需替換該行(用它自己)。
請注意,這.*是貪婪的并且盡可能多地匹配它.*\n后面的模式,這里我們在它前面有整個檔案,所以它可能看起來會一直匹配到\n檔案中的最后一個!但是,.不匹配換行符(帶有/s修飾符),因此.*\n此處在第一個換行符處停止,因此它與該行的其余部分匹配。
如果需要匹配更具體的包含陳述句,請按照#include模式添加詳細資訊。?
否則,可以逐行處理,通過復制當前行并在下一行列印,具體取決于保存的和下一行的內容。那里有一些挑剔的細節需要整理,而不是超級適合單線。
都用輸入測驗file.c(注意:它確實以空行開頭)
#include<item_b/item_bC.h>
#include<item_a/item_aC.h>
#include<item_c/item_cC.h>
int main() {
回傳 1;
}
我們最終得到兩個item_b、一個item_a和兩個itewm_c包含且沒有空行,檔案的其余部分不受影響。
? 提到了特殊字符,所以我會發表評論。但請參考更完整的資源,如教程perlretut和參考perlre。另見perlrebackslash
正則運算式的特殊字符在使用\. 但在這種情況下,這是不需要的:/在正則運算式中的作用只是分隔模式,通常以 給出/.../,但在這里我{}{}用作分隔符;所以/這里沒什么特別的,可以自由使用。例如
perl -0777 -wpe's{ ^\s*\n (?= (\#include<item_./.*\n) ) }{$1}mxg' file.c
匹配我使用的輸入檔案中的行,如上所示。
顯然有一個更通用的模式而不是item實際問題,它是一個檔案名。檔案名中允許的大多數字符都可以在正則運算式中直接使用。例外,比如.,可以被轉義,比如\.匹配一個文字.。
For example, a string item_bC.h, where bC characters vary but item and .h are always the same, can be matched with the pattern /item_..\.h/.
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/316280.html
