J'ai un gros fichier qui contient des caractères spéciaux. Il y a là un code multi-lignes que je veux remplacer sed
.
Cette:
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"
Doit se transformer en ceci:
text = ""
J'ai essayé le code suivant, mais pas de chance:
sed -i '/ text = "*/ {N; s/ text = .*affected.\./ text = ""/g}' /etc/exim.conf
Il ne remplace rien et n'affiche aucun message d'erreur
J'ai joué avec, mais tout ce que j'essaye ne fonctionne pas.
text-processing
sed
perl
blade19899
la source
la source
sed
ou êtes-vous ouvert à d'autres outils? Peut-il y avoir"
à l'intérieur dutext=
bloc? Peut-il y avoir d'autres castext =
dans votre dossier? Y aura-t-il toujours 4 lignes de texte ou peut-il y en avoir plus / moins?sed
, ou tout ce qui ne nécessite pas d'installation sur un serveur CentOS. Out of the box toolstext =
dans le dossier, le résultat doit êtretext = ""
. Les fichiers ont 891 lignes de code. AINSI, il faut respecter l'autre texte.text = ""
. Comme vu dans ma question.Réponses:
Perl à la rescousse:
-i~
éditera le fichier "en place", laissant une copie de sauvegarde-0777
lit tout le fichier en une seule fois, pas ligne par ligneLa substitution
s///
fonctionne de la même manière que dans sed (c'est-à-dire qu'elle correspondtext = "
suivie par autre chose que des guillemets doubles plusieurs fois jusqu'à un guillemet double), mais dans ce cas, elle fonctionne sur l'ensemble du fichier.la source
Vous devez vérifier l'espace de motif et continuer à tirer sur la
N
ligne ext si elle ne correspond pas, par exempleavec
gnu sed
vous pouvez l'écrire commeCe n'est pas très efficace cependant, mieux vaut simplement sélectionner la plage
/text = "/,/"/
, modifier la première ligne et supprimer le reste:encore une fois, avec
gnu sed
vous pouvez l'écrire comme une ligne:la source
Personnellement, je le ferais en Perl. Si nous pouvons supposer qu'il n'y en a pas
"
avant la clôture"
, vous pouvez faire:Le
-0
slurps le fichier entier, le lisant dans la mémoire. Le-p
moyen "imprimer chaque ligne (ici, une" ligne "sera le fichier entier) après avoir appliqué le script donné par-e
". Le script lui-même est un simple opérateur de substitution. Il capturera la chaînetext
suivie de 0 ou plusieurs caractères d'espacement, un=
et 0 ou plusieurs espaces à nouveau (text\s*=\s*
) et l'enregistrera sous$1
. Ensuite, il remplacera le modèle capturé ainsi que la chaîne entre guillemets la plus courte qu'il trouve avec les modèles ($1
) et""
. Les
drapeau fait.
correspondre les nouvelles lignes.la source
-00
lit en paragraphes, pas tout le dossier ( réf ). Si le texte entre guillemets contient une ligne vierge, alors l'expression régulière ne correspondra pas.perl -00ne 'print;exit'
. Et je mets toujours le mauvais dans ma réponse! Merci, réparé maintenant.