Eu tenho um arquivo grande com caracteres especiais. Há um código de várias linhas lá, que eu quero substituir sed
.
Este:
text = "\
------ ------\n\n\
This message was automatically generated by email software\n\
The delivery of your message has not been affected.\n\n\
------ ------\n\n"
Precisa se transformar nisso:
text = ""
Eu tentei o seguinte código, mas sem sorte:
sed -i '/ text = "*/ {N; s/ text = .*affected.\./ text = ""/g}' /etc/exim.conf
Ele não substitui nada e não exibe nenhuma mensagem de erro
Eu tenho brincado com isso, mas tudo o que tento não funciona.
text-processing
sed
perl
blade19899
fonte
fonte
sed
ou você está aberto a outras ferramentas? Pode haver"
dentro dotext=
bloco? Pode haver outros casostext =
no seu arquivo? Sempre haverá quatro linhas de texto ou pode haver mais / menos?sed
, ou qualquer coisa que não exija instalação em um servidor CentOS. Ferramentastext =
na pasta, o resultado precisa sertext = ""
. Os arquivos possuem 891 linhas de código. Portanto, ele precisa respeitar o outro texto.text = ""
. Como visto na minha pergunta.Respostas:
Perl para o resgate:
-i~
irá editar o arquivo "no local", deixando uma cópia de backup-0777
lê o arquivo inteiro de uma só vez, não linha por linhaA substituição
s///
funciona da mesma forma que no sed (ou seja, corresponde atext = "
qualquer coisa, exceto aspas duplas muitas vezes até aspas duplas), mas, neste caso, funciona em todo o arquivo.fonte
Você deve verificar o espaço do padrão e continuar puxando a
N
linha ext se não corresponder, por exemplocom
gnu sed
você pode escrevê-lo comoPorém, isso não é muito eficiente; é melhor selecionar o intervalo
/text = "/,/"/
, modificar a primeira linha e excluir o restante:novamente,
gnu sed
você pode escrever como uma linha:fonte
Pessoalmente, eu faria isso em Perl. Se pudermos assumir que não há
"
antes do fechamento"
, você pode:Ele
-0
sorve o arquivo inteiro, lendo-o na memória. Os-p
meios "imprima todas as linhas (aqui, uma" linha "será o arquivo inteiro) depois de aplicar o script fornecido por-e
". O script em si é um operador de substituição simples. Ele capturará a sequênciatext
seguida por 0 ou mais caracteres de espaço em branco,=
e 0 ou mais espaços de novo (text\s*=\s*
) e salvará como$1
. Em seguida, ele substituirá o padrão capturado, bem como a string mais curta citada, pelo padrão ($1
) e""
. As
bandeira.
cria novas linhas de correspondência.fonte
-00
lê parágrafos, não o arquivo inteiro ( ref ). Se o texto entre aspas contiver uma linha em branco, a regex não corresponderá.perl -00ne 'print;exit'
. E ainda coloco o errado na minha resposta! Obrigado, corrigido agora.