Linux + substitui STRING / WORD no arquivo de acordo com a regra

1

Meu alvo é substituir qualquer palavra / string / qualquer caractere no arquivo com nova palavra / string de acordo com as seguintes regras:

  1. Se caracteres numéricos no lado esquerdo da palavra / string, então não substituiremos a palavra
  2. Se caracteres numéricos no lado direito da palavra / string, então não substituiremos a palavra

observação - numérico significa qualquer número ou [a-z] ou [A-Z]

O exemplo a seguir descreveu o arquivo antes e o arquivo depois:

Eu quero substituir a palavra "$$ OLD_WORD $$" por "& & NEW_WORD & &"

exemplo 1 - arquivo Antes da substituição

  more file 

  ABC$$OLD_WORD$$ABC
  $$OLD_WORD$$GG
  $$OLD_WORD$$
  1$$OLD_WORD$$

exemplo 2 - arquivo após a substituição

  more file

  ABC$$OLD_WORD$$ABC
  $$OLD_WORD$$
  &&NEW_WORD&&
  1$$OLD_WORD$$

Então, para substituir a palavra sobre as regras (1,2) que mencionei Eu escrevo a seguinte sintaxe (este comando Perl existe no meu script ksh)

     perl -pe 'next if /^#/; s/(\Q|[[:^alnum:]])$ENV{OLD_TEXT}(\E|[[:^alnum:]])/$1$ENV{NEW_TEXT}$2/g' file

Mas este comando perl não substitui o exemplo 2 !!!

O exemplo a seguir descreveu o que recebo da minha máquina Solaris / linux:

    export OLD_TEXT='$$OLD_WORD$$'
    export NEW_TEXT='&&NEW_WORD&&'

     perl -pe 'next if /^#/; s/(\Q|[[:^alnum:]])$ENV{OLD_TEXT}(\E|[[:^alnum:]])/$1$ENV{NEW_TEXT}$2/g' file




      &&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&                  &&NEW_WORD&&ABC$&&NEW_WORD&&$&&NEW_WORD&&OLD_&&NEW_WORD&&WORD$&&NC
          &&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&    &&NEW_WORD&&$&&NEW_WORD&&$&&NEW_WORD&&OLD_&&NEW_WORD&&
      &&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&     &&NEW_WORD&&1$&&NEW_WORD&&$&&NEW_WORD&&OLD_&&NEW_WORD&

Por favor, avise o que eu preciso corrigir na minha sintaxe perl para obter resultados como exemplo 2?

.

    
por yael 11.12.2012 / 10:54

1 resposta

0

Você precisa usar um look-behind negativo / -ahead:

export OLD_TEXT='$$OLD_WORD$$'
export NEW_TEXT='&&NEW_WORD&&'

perl -pe 's/(?<![[:alnum:]])\Q$ENV{OLD_TEXT}\E(?![[:alnum:]])/$ENV{NEW_TEXT}/g' file

ABC$$OLD_WORD$$ABC
&&NEW_WORD&&
&&NEW_WORD&&
1$$OLD_WORD$$
    
por 11.12.2012 / 15:50