Encontre e substitua usando partes da string encontrada na string de substituição

2

Deixa foo qualquer string. Eu tenho que procurar um arquivo para todas as ocorrências de

   \LeftLabel{foo}

e substitua cada ocorrência por

   \LeftLabel{\textsf{foo}}

mas apenas se foo não começar com um caractere $ . Como?

    
por spilot 29.11.2015 / 02:11

1 resposta

4

Vamos considerar este arquivo de teste:

$ cat file
\LeftLabel{foo}
\LeftLabel{$foo}
LeftLabel{foo}

Agora, vamos fazer a substituição:

$ sed -E 's|\LeftLabel\{([^$}][^}]*)\}|\LeftLabel{\textsf{}}|g' file
\LeftLabel{\textsf{foo}}
\LeftLabel{$foo}
LeftLabel{foo}

Como funciona

O comando substituto em sed se parece com s|old|new|g , em que old é uma expressão regular, new é o que substituir em seu lugar e a% finalg informa sed para substituir todas essas ocorrências em uma linha não apenas o primeiro.

Em nosso comando, a parte old se parece com:

\LeftLabel\{([^$}][^}]*)\}

Corresponde a \LeftLabel{ seguido por qualquer caractere diferente de $ ou } , que é [^$}] , seguido por qualquer número de qualquer caractere não } , ou seja, [^}]* , seguido por% código%. Observe que alguns desses caracteres precisam ter uma barra invertida na frente deles, para que o sed os trate como caracteres normais, e não como caracteres regex-ativos. Observe também que os caracteres dentro das chaves são colocados entre parênteses. Os parênteses são caracteres regex-ativos que dizem ao sed para salvar o que está dentro deles como grupo 1. Podemos referenciar esses caracteres como } na parte do comando.

    
por 29.11.2015 / 02:19