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]. Tenho que pesquisar a linha onde posso encontrar a palavra-chave RESOURCE e substituir a palavra depois do sinal de igual. A RESOURCE palavra-chave não pode ser modificada.

Alguém poderia me ajudar nisso?

entrada:

[email protected] 

Resultado:

[email protected] 

Resposta

grep não é útil neste caso, pois não permite que você modifique o conteúdo do arquivo.

Em vez disso, pode-se usar sed assim:

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 

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

Comentários

  • Não quero codificar permanentemente [email protected], deve ser algo como nasir37 @ yahoo .com. quero substituir por qualquer outro como [email protected]. deve ser dinâmico – Lakshminarayana agora edite
  • @Lakshminarayana Veja a resposta atualizada.
  • Não quero escreva-o em um novo arquivo novamente .. porque o arquivo consiste em outros dados também. Como a seguir.
  • @Lakshminarayana Em seguida, execute com sed -i se você achar ele ' está fazendo a coisa certa e não ' t redireciona para um novo arquivo. I ' m geralmente evitando usar sed -i, pois ' é não portátil e desde que se você fizer um tipo o, isso pode destruir seus dados originais.
  • Eu entendo isso. como posso pesquisar a linha que contém a palavra RESOURCE. Tenho que procurar em um arquivo que contém outros dados e tenho que substituí-lo. Além disso, tenho que passar o nome do arquivo como um parâmetro

Resposta

O sed é melhor.

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

O acima funciona no meu teste, mas se você quiser testar você mesmo, 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, fornece a alteração desejada de:

[email protected] 

Se o valor de RESOURCE for 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 de que precisa sem todo este rigamarole.

Comentários

  • Não quero codificar o [email protected], deve ser algo como [email protected]. Quero substituir por qualquer outro, como [email protected]. deveria seja dinâmico
  • Não ' não entendo o que você quer dizer. Em sua pergunta, isso mostra que você deseja que a saída seja [email protected] que ambas as respostas alcançam. O que você quer dizer com: " Eu não quero codificar o [email protected] "? e " deve ser dinâmico "?
  • @Lakshminarayana Se você quiser que ele realmente faça as alterações no arquivo então use sed i como eu dei no meu primeiro comando. Teste-o primeiro com o sed sozinho no meu segundo comando para ter certeza de que ' está fazendo o que você quer e, em seguida, use o sed -i em meu primeiro comando assim que você ' tiver certeza de que funciona.
  • quero dizer, não quero hard code eles. sed ' s / RESOURCE = Lnreddy37 @ gmail.com / RESOURCE = reddy17777 @ gmail.com / ' seuarquivo. Eu quero passá-lo como parâmetros de entrada e saída.e também quero pesquisar aquela linha onde tenho RECURSO e tenho que substituí-lo
  • @Lakshminarayana Então use a resposta de Kusalananda ' e passe os endereços de e-mail para uma variável ou grep RESOURCE= file, obtenha o endereço de e-mail que aparece e, em seguida, use sed -i e substitua [email protected] e [email protected] com o que estiver lá e como você quiser.

Resposta

Você parece estar dizendo que deseja substituir a string que aparece após =, 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 após =, você deseja substituí-la por [email protected] – aparentemente você deseja que está codificado.

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

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

que (como todos os comandos abaixo) usa o fato de que .* significa “corresponder a qualquer coisa existe”. Se não quiser digitar RESOURCE= duas vezes, você pode encurtar o 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 \1 significa substituir pelo primeiro grupo.

Os comandos acima irão localizar e substituir RESOURCE= onde quer que apareça 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 alterada 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ê deseja 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ê deseja, com explicações completas e claras e exemplos.


OK, escolha uma das s comandos. Agora, se você deseja editar seu arquivo no local (como você indicou), faça

sed -i { s command } { yourfile }

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

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

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

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *