Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How do I add new lines after deleting a large amount of text in Perl windows?

I’m trying to remove a large amount of text from a file before inserting a few new lines. I can delete everything after the word ‘CParticleSystemDefinition’ with a single line of code like this

perl -0777 -pi -we "s/CParticleSystemDefinition\x22\K.*/\n}/s" "D:\Steam\steamapps\common\dota 2 beta\content\dota_addons\custom\particles\generic_gameplay\winter_effects_creep.vpcf"

But when I try to change the code slightly so that it adds a few new lines like this, it doesn’t work

perl -0777 -pi -we "s/CParticleSystemDefinition\x22\K.*/\n      m_Children = \n    [\n        {\n            m_ChildRef = resource:\x22particles/generic_gameplay/winter_effects_breath.vpcf\x22\n        },\n    ]\n}/s" "D:\Steam\steamapps\common\dota 2 beta\content\dota_addons\custom\particles\generic_gameplay\winter_effects_creep.vpcf"

So, basically, what I want to do is make this file

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

{
    _class = "CParticleSystemDefinition"
    m_bShouldHitboxesFallbackToRenderBounds = false
    m_nMaxParticles = 24
    m_flConstantRadius = 15.000000
    m_flConstantLifespan = 0.500000
    m_ConstantColor = 
    [
        212,
        170,
        145,
        255,
    ]
    m_bShouldSort = false
    m_Renderers = 
    [
        {
            _class = "C_OP_RenderSprites"
            m_nSequenceCombineMode = "SEQUENCE_COMBINE_MODE_USE_SEQUENCE_0"
            m_bMod2X = true
            m_nOrientationType = 3
            m_hTexture = resource:"materials/particle/footprints/footprints_generic.vtex"
            m_flAnimationRate = 1.000000
        },
    ]
    m_Emitters = 
    [
        {
            _class = "C_OP_ContinuousEmitter"
            m_flEmitRate = 10.000000
            m_flStartTime = 0.500000
            m_nScaleControlPoint = 5
        },
    ]
}

look like this

{
    _class = "CParticleSystemDefinition"
    m_Children = 
    [
        {
            m_ChildRef = resource:"particles/generic_gameplay/winter_effects_breath.vpcf"
        },
    ]
}

>Solution :

Do it in two steps — clear the rest of the file after that phrase, then add the desired text

perl -0777 -i.bak -wpe"s{CParticle...\x22\K.*}{}s; $_ .= qq(\n\tm_Children...)"  file

where I’ve used ellipses to indicate the rest, for clarity. I added .bak to keep a backup file, until this is tested well enough.


If you don’t want tabs, which may or may not get expanded depending on various settings and on what’s done with this, can build the replacement more systematically

perl -0777 -i.bak -wpe"
    s{CParticle...\x22\K.*}{}s; 
    $s4 = q( ) x 4;  # four spaces
    $_ .= join qq(\n$s4), 
        q(m_Children =),
        q([),
        qq($s4).q({), 
        qq($s4).q(m_ChildRef = ...)  # etc
" file

Now one can either build this into a better system, if there is a lot to add, or condense if there’s really just a few lines.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading