sed 編輯文件中特定段落之間的字串

sed 編輯文件中特定段落之間的字串

我有一個名為 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";
)

但是請記住,您的“語言”中可能存在語法中性的內容(例如空白行)之內函數)可能會破壞這種方法 - 因此,正規表示式通常不是此類任務的糟糕選擇。

相關內容