Grep e substitua

0

Eu tenho um arquivo que tem uma palavra-chave RESOURCE . Pode ocorrer em qualquer lugar do arquivo, como:

[email protected]

Agora quero substituir [email protected] por [email protected] . Eu tenho que procurar a linha onde eu posso encontrar a palavra-chave RESOURCE e, em seguida, substitua a palavra após o sinal de igual. A palavra-chave RESOURCE deve permanecer inalterada.

Alguém poderia me ajudar nisso?

entrada:

[email protected]

Saída:

[email protected]
    
por Lakshminarayana 29.05.2018 / 12:38

3 respostas

1

grep não é útil neste caso, pois não permite modificar o conteúdo do arquivo.

Em vez disso, pode-se usar sed da seguinte forma:

fromaddr='[email protected]'
toaddr='[email protected]'

sed '/^RESOURCE=/s/='"$fromaddr"'$/='"$toaddr"'/' file >newfile

Dado file como

some data
[email protected]
[email protected]
[email protected]
[email protected]
more data

isso cria newfile como

some data
[email protected]
[email protected]
[email protected]
[email protected]
more data

A expressão sed selecionará as linhas que começam com a string RESOURCE . Para cada linha, ela substituirá o endereço de e-mail, se estiver presente na linha. O padrão usado para a substituição garante que correspondamos ao = e que o endereço termine no final da linha.

    
por 29.05.2018 / 12:57
0

O comando sed é melhor.

sed -i 's/[email protected]/[email protected]/' yourfile

Os itens acima funcionam no meu teste, mas se você quiser testá-lo, tente primeiro:

sed 's/[email protected]/[email protected]/' yourfile

Isso gravará as alterações na saída padrão sem afetar o arquivo.

De qualquer forma, isso dá a sua mudança desejada:

[email protected]

Se o valor de RESOURCE for diferente no arquivo e você quiser alterar algo diferente, então:

grep RESOURCE= yourfile

Isso retornará a linha onde está e mostrará o valor.

Você pode usar

sed 's/[email protected]/[email protected]/' yourfile

Para referência futura, é importante deixar tudo isso claro na sua pergunta original, para que você possa obter a ajuda de que precisa sem todo esse rigamarole.

    
por 29.05.2018 / 12:54
0

Você parece estar dizendo que você deseja substituir a string que aparece após o = , não importa o que seja - por exemplo , nos dados da amostra, você deseja substituir [email protected] . Mas você está dizendo que, não importa a string após o = , você deseja substituí-lo por [email protected] - aparentemente você quer isso codificado.

Existem algumas variações sobre como fazer isso. O mais simples é

sed 's/RESOURCE=.*/[email protected]/'

qual (como todos os comandos abaixo) usa o fato de que .* significa “corresponde ao que está lá”. Se você não quiser digitar RESOURCE= duas vezes, poderá encurtar o texto acima para

sed 's/\(RESOURCE=\).*/[email protected]/'

em que \(\) marca uma parte da cadeia de pesquisa como um grupo (você pode ter até nove grupos) e significa substituir pelo primeiro grupo.

Os comandos acima encontrarão e substituirão RESOURCE= onde quer que apareça na linha. Então, por exemplo, a entrada

# Lakshminarayana wants to change all occurrences of "RESOURCE=".
[email protected]
[email protected]
[email protected]
FOX RESOURCE=The quick brown fox
# Comment: Originally line 2 said [email protected]

seria alterado para

# Lakshminarayana wants to change all occurrences of "[email protected]
[email protected]
[email protected]
[email protected]
FOX [email protected]
# Comment: Originally line 2 said [email protected]

Se você quiser corresponder apenas quando RESOURCE= aparecer no início de uma linha, use ^ :

sed 's/^RESOURCE=.*/[email protected]/'

ou

sed 's/^\(RESOURCE=\).*/[email protected]/'

Se você deseja substituir apenas o valor do recurso, e não todo o resto da linha - por exemplo,

[email protected]    [email protected]

para

[email protected]   [email protected]

isso também pode ser feito. Edite sua pergunta para dizer exatamente o que você quer com explicações completas e claras e exemplos.

OK, escolha um dos comandos s acima. Agora, se você quiser editar seu arquivo no lugar (como você indicou), faça

sed  -i  {s command }  { yourfile }

Se você quiser produzir um novo arquivo, faça

sed  {s command }  { oldfile }  >  { newfile }

Não digite os { e } ; eles estão lá apenas para demarcação.

    
por 07.06.2018 / 00:00