我有一个名为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";
)
但是请记住,在你的“语言”中,可能在语法上是中性的(比如空行之内函数)可能会破坏这种方法 - 因此,正则表达式通常不是此类任务的良好选择。