Grep e substitua

Grep e substitua

Eu tenho um arquivo que possui uma RESOURCEpalavra-chave. Pode ocorrer em qualquer lugar do arquivo, como:

[email protected]

Agora quero substituir [email protected]por [email protected]. Tenho que procurar a linha onde posso encontrar a RESOURCEpalavra-chave e depois substituir a palavra após o sinal de igual. A RESOURCEpalavra-chave deve permanecer inalterada.

Alguém poderia me ajudar nisso?

entrada:

[email protected]

Saída:

[email protected]

Responder1

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

Em vez disso, pode-se usar sedassim:

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

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

Dado filecomo

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

isso cria newfilecomo

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

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

Responder2

O sedcomando é melhor.

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

O acima funciona no meu teste, mas se você quiser testar por si mesmo, você pode tentar este 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, dá a mudança desejada de:

[email protected]

Se o valor de RESOURCEfor diferente no arquivo e você quiser alterá-lo para algo diferente, então:

grep RESOURCE= yourfile

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

Você pode então usar

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

Para referência futura, é importante deixar tudo isso claro em sua pergunta original para que você possa obter a ajuda necessária sem toda essa burocracia.

Responder3

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

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

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

que (como todos os comandos abaixo) usa o fato que .*significa “combinar com o que estiver lá”. Se não quiser digitar RESOURCE=duas vezes, você pode encurtar o texto acima para

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

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

Os comandos acima serão encontrados e substituídos RESOURCE= onde quer que apareçam na linha. Assim, 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 fazer a correspondência apenas quando RESOURCE=aparecer no início de uma linha, use^:

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

ou

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

Se você quiser substituir apenas o valor do recurso e não todo o restante 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ê deseja, com explicações completas e claraseexemplos.


OK, escolha uma das opções acimascomandos. Agora, se você quiser editar seu arquivo no local (como você indicou), faça

sed  -i  {s command }  { yourfile }

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

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

Na verdade, não digite o{e}; eles estão lá apenas para demarcação.

informação relacionada