Sed - Correspondência com padrão de linhas múltiplas após encontrar a primeira parte de um padrão

0

Eu preciso usar o sed para:

Substituir sequências como:

tr("Text");

PARA

"text";

tr("Textfsafasfsfas safasdfsafas");

PARA

"Textfsafasfsfas safasdfsafas";

foo(tr("text")); PARA foo("text");

Não substitua essas sequências:

tr("text").arg(text);

tr("I am some text") .arg(i do stuff);

tr("I am some text") .arg(i do stuff) .arg(I also do stuff);

onde ele precisa ser manipulado de 1 até n linhas.

Meu código atual não cobre o caso da borda de várias linhas.arg. Alguma idéia brilhante?

Código sed atual:

sed -i '/\btr(/{ :a; s/\btr(\([^)]*\))\([^.]\)//I; t; N; ba}' $file_t

Editar:

errors << tr("Error: Encountered an invalid token at line: %1, column: %2.") .arg(m_reader.lineNumber()) .arg(m_reader.columnNumber());

é um caso de borda que ainda é um problema no momento.

    
por Klamz 31.08.2016 / 15:36

1 resposta

1
$ cat ip.txt 
tr("Text");

tr("Textfsafasfsfas
safasdfsafas");

foo(tr("text"));

tr("text").arg(text);

tr("I am some text")
.arg(i do stuff);

tr("I am some text")
.arg(i do stuff)
.arg(I also do stuff);

tr("I am some text")
    .arg(i do stuff);

Se o arquivo for pequeno o suficiente para conter a memória depois de adicionar todas as linhas como uma única string,

$ perl -0777 -pe 's/\btr\(([^)]+)\)(?!\s*.arg)/$1/g' ip.txt 
"Text";

"Textfsafasfsfas
safasdfsafas";

foo("text");

tr("text").arg(text);

tr("I am some text")
.arg(i do stuff);

tr("I am some text")
.arg(i do stuff)
.arg(I also do stuff);

tr("I am some text")
    .arg(i do stuff);

Se a saída estiver correta, adicione a opção -i ou -i.bak para edição no local

Editar:

Obrigado @Costas por apontar que \n?\s* pode ser reduzido para \s*

    
por 31.08.2016 / 16:54