sed: excluindo strings de partes do servidor do padrão correspondente

2

Então a ideia é substituir o padrão correspondente nas_... com nas_$SCL usando a variável $ SCL em um arquivo, mas excluindo 2 correspondências exatas nas_mba && nas_tvr , que não devem ser substituídas

Até agora eu tenho código excluindo as duas correspondências, mas também interferindo em outras correspondências indesejadas

sed -i "s/nas_[^mt][^bv][^ar]/nas_$SCL/gI" filename.xml

Como posso excluir apenas essas duas correspondências exatas?

Atualizar : Até agora eu encontrei a próxima solução

sed -i "/(nas_mba|nas_tvr)/! s/nas_.../nas_$SCL/"

mas pula uma linha inteira se tiver uma correspondência

    
por Max Shepelev 03.02.2017 / 08:44

2 respostas

2

Aqui está como eu faria:

sed -E '/(nas_mba|nas_tvr)/! s/nas_.../nas_bar/'

Exemplo:

echo "nas_mba
nas_tvr
nas_foo" | sed -E '/(nas_mba|nas_tvr)/! s/nas_.../nas_bar/'
nas_mba
nas_tvr
nas_bar

Apenas nas_foo no texto original é substituído, enquanto nas_mba e nas_tvr não são alterados.

Outro exemplo com mais linhas:

echo "nas_hat
> nas_mba
> nas_foo
> nas_hat
> nat_tvr
> nas_cat
> nas_dog" | sed -E '/(nas_mba|nas_tvr)/! s/nas_.../nas_bar/'
nas_bar
nas_mba
nas_bar
nas_bar
nat_tvr
nas_bar
nas_bar

Se você quer mudar de lugar, basta adicionar a opção -i (se você usa o GNU sed você não precisa de -i "" , basta -i seria suficiente):

sed -E -i "" '/(nas_mba|nas_tvr)/! s/nas_.../nas_bar/' nas.txt 
cat nas.txt 
nas_bar
nas_mba
nas_bar
nas_bar
nat_tvr
nas_bar
nas_bar

Testado no Mac OS X 10.11.6 e no BSD sed .

    
por 03.02.2017 / 09:08
2

Se perl for uma opção, você pode usar lookahead :

export SCL
perl -pe 's/nas_(?!mba|tvr)\w*/nas_$ENV{SCL}/g' file

(observe que isso pressupõe que as sequências que você faz deseja corresponder consistem em caracteres de palavras - ele pode ser modificado se não for o caso).

    
por 03.02.2017 / 14:41

Tags