sed edita string entre parágrafo específico em um arquivo

sed edita string entre parágrafo específico em um arquivo

Eu tenho um arquivo chamado a.txt. E contém o seguinte conteúdo. Não se sabe quantas linhas entre cada função.

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

eu quero editar

function b(
line 1;
line 2;
line ...;
properties pro= "test";
)

para o seguinte

function b(
line 1;
line 2;
line ...;
properties pro= "replace";
)

É possível usar comandos de uma linha como sed ou awk?

Responder1

Desde que suas funções sejam delimitadas em parágrafos por uma ou mais linhas em branco, conforme mostrado, você poderá usar o awk com um separador de registros vazio. Em particular, com 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";
)

Você também pode usar o awk não-GNU, mas precisará definir um separador de registro de saída fixo, ORSpois o RTseparador é específico do GNU.

Perl fornece um modo de parágrafo semelhante por meio da -00opção.

Com sed, você poderia usar um intervalo de endereços de expressão regular para limitar o escopo da substituição 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";
)

Contudo tenha em mente que coisas que podem ser sintaticamente neutras na sua "linguagem" (como linhas em brancodentro deuma função) pode quebrar esta abordagem - por esta razão, expressões regulares são muitas vezes uma má escolha para tais tarefas.

informação relacionada