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,您可以使用正则表达式地址范围来限制替换的范围,例如。

$ 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";
)

但是请记住,在你的“语言”中,可能在语法上是中性的(比如空行之内函数)可能会破坏这种方法 - 因此,正则表达式通常不是此类任务的良好选择。

相关内容