
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, ORS
pois o RT
separador é específico do GNU.
Perl fornece um modo de parágrafo semelhante por meio da -00
opçã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.