
我有一個名為 a.txt 的檔案。並包含以下內容。不知道每個函數之間有多少行。
function a(
line 1;
line 2;
line ...;
properties pro = "test";
)
function b(
line 1;
line 2;
line ...;
properties pro= "test";
)
function c(
properties pro= "test";
)
我要編輯
function b(
line 1;
line 2;
line ...;
properties pro= "test";
)
到以下
function b(
line 1;
line 2;
line ...;
properties pro= "replace";
)
是否可以使用像 sed 或 awk 這樣的一行指令?
答案1
如果您的函數由一個或多個空白行分隔成段落,如圖所示,那麼您可以使用帶有有空記錄分隔符號的 awk。特別是,對於 GNU awk:
$ gawk '
BEGIN{RS=""}
/^function b/ {sub(/properties pro= "test"/,"properties pro= \"replace\"")}
{printf "%s%s", $0, RT}
' a.txt
function a(
line 1;
line 2;
line ...;
properties pro = "test";
)
function b(
line 1;
line 2;
line ...;
properties pro= "replace";
)
function c(
properties pro= "test";
)
您也可以使用非 GNU awk,但您需要設定固定的輸出記錄分隔符,ORS
因為RT
分隔符號是 GNU 特定的。
Perl 透過選項提供了類似的段落模式-00
。
使用 sed,您可以使用正規表示式位址範圍來限制替換 ex 的範圍。
$ sed '/^function b/,/^)$/s/properties pro= "test"/properties pro= "replace"/' a.txt
function a(
line 1;
line 2;
line ...;
properties pro = "test";
)
function b(
line 1;
line 2;
line ...;
properties pro= "replace";
)
function c(
properties pro= "test";
)
但是請記住,您的“語言”中可能存在語法中性的內容(例如空白行)之內函數)可能會破壞這種方法 - 因此,正規表示式通常不是此類任務的糟糕選擇。