Para o caso em que os comandos tr(
estão sempre distribuídos em duas linhas, tente:
$ sed '/tr(/N; s/tr(\([^)]*\))//I' "$file_t"
...."Changes to output mappings will be deleted. "
"There is no undo available. Do you want to continue?");
A única alteração aqui é a adição de /tr(/N
. Para qualquer linha que corresponda a tr(
, leia a próxima linha e adicione-a ao espaço padrão ( N
).
Para alterar o arquivo, use -i
:
sed -i.bak '/tr(/N; s/tr(\([^)]*\))//I' "$file_t"
Versão mais robusta
Se for possível que os comandos tr(...)
apareçam em uma linha, em duas linhas ou em mais de duas linhas, precisamos alterar um pouco a lógica:
sed '/tr(/{ :a; s/tr(\([^)]*\))//I; t; N; ba}' filename
Isso procura linhas que contenham tr(
. Para qualquer uma dessas linhas, os comandos em chaves, {...}
, são executados. Para essas linhas, a substituição é primeiramente tentada apenas nessa linha. Se a substituição acontecer, o comando t
informará que concluímos esta linha. Se isso não aconteceu, o que significa que não houve fechamento )
, então a próxima linha é lida em ( N
) e sed filiais de volta ao rótulo a
( ba
) e a substituição é tentada novamente. Isso se repete até que linhas suficientes sejam lidas para encontrar o )
.
Como exemplo, aqui está um arquivo com tr(...)
distribuído em uma, duas e três linhas:
$ cat filename
tr("abc");
....tr("Changes to output mappings will be deleted. "
"There is no undo available. Do you want to continue?"));
tr("one
two
three");
Aqui está a saída:
$ sed '/tr(/{ :a; s/tr(\([^)]*\))//I; t; N; ba}' filename
"abc";
...."Changes to output mappings will be deleted. "
"There is no undo available. Do you want to continue?");
"one
two
three";
Distinguindo entre tr(...)
e Ptr(...)
Para garantir que substituímos apenas tr
e não Ptr
ou Str
, precisamos garantir que tr
comece em um limite de palavra. Com o GNU sed (Linux), um limite de palavra é denotado \b
:
sed '/\btr(/{ :a; s/\btr(\([^)]*\))//I; t; N; ba}' filename
Usando o BSD (OSX) sed, o seguinte pode funcionar:
sed '/[[:<:]]tr(/{ :a; s/[[:<:]]tr(\([^)]*\))//I; t; N; ba}' filename