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
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 osed
sozinho no meu segundo comando para ter certeza de que ' está fazendo o que você quer e, em seguida, use osed -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, usesed -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.
sed -i
se você achar ele ' está fazendo a coisa certa e não ' t redireciona para um novo arquivo. I ' m geralmente evitando usarsed -i
, pois ' é não portátil e desde que se você fizer um tipo o, isso pode destruir seus dados originais.