
Eu tenho um arquivo que possui uma RESOURCE
palavra-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 RESOURCE
palavra-chave e depois substituir a palavra após o sinal de igual. A RESOURCE
palavra-chave deve permanecer inalterada.
Alguém poderia me ajudar nisso?
entrada:
[email protected]
Saída:
[email protected]
Responder1
grep
não é útil neste caso, pois não permite modificar 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
A sed
expressã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 sed
comando é 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 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 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 \1
significa 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 acimas
comandos. 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.