我是 Perl 的新手,我想從中替換一個文本
<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{aafc65d8-7a5a-4e01-bd8d-3ac118422503} -->
{
_class = "CParticleSystemDefinition"
m_bShouldHitboxesFallbackToRenderBounds = false
m_nMaxParticles = 1
m_nInitialParticles = 1
m_flConstantRadius = 15.000000
m_ConstantColor =
[
255,
0,
0,
255,
]
m_nConstantSequenceNumber = 8
m_nConstantSequenceNumber1 = 7
m_Renderers =
[
{
_class = "C_OP_RenderSprites"
m_nSequenceCombineMode = "SEQUENCE_COMBINE_MODE_USE_SEQUENCE_0"
m_bMod2X = true
m_bDisableZBuffering = true
m_hTexture = resource:"materials/particle/particle_modulate_01.vtex"
m_nOrientationType = 2
},
]
}
對此。
<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{aafc65d8-7a5a-4e01-bd8d-3ac118422503} -->
{
_class = "CParticleSystemDefinition"
}
這是我一直在使用的命令:
perl -pi.bak -e "s/CParticleSystemDefinition"/CParticleSystemDefinition"\n}/g;" “C:\檔案夾\檔案.vpcf”
它一直在為我產生這個結果
<!-- kv3 encoding:text:version{e21c7f3c-8a33-41c5-9977-a76d3a32aa0d} format:generic:version{aafc65d8-7a5a-4e01-bd8d-3ac118422503} -->
{
_class = "CParticleSystemDefinition"
}
m_bShouldHitboxesFallbackToRenderBounds = false
m_nMaxParticles = 1
m_nInitialParticles = 1
m_flConstantRadius = 15.000000
m_ConstantColor =
[
255,
0,
0,
255,
]
m_nConstantSequenceNumber = 8
m_nConstantSequenceNumber1 = 7
m_Renderers =
[
{
_class = "C_OP_RenderSprites"
m_nSequenceCombineMode = "SEQUENCE_COMBINE_MODE_USE_SEQUENCE_0"
m_bMod2X = true
m_bDisableZBuffering = true
m_hTexture = resource:"materials/particle/particle_modulate_01.vtex"
m_nOrientationType = 2
},
]
}
那么,我該如何做到這一點,以便替換某些東西會洗掉它之后的所有內容?我還想將命令保留在一行上。
uj5u.com熱心網友回復:
我如何做到這一點,以便替換某些東西會洗掉它之后的所有內容?
還需要匹配它之后的所有內容,但將其留在替換中
perl -0777 -pi.bak -we"s/CParticleSystemDefinition\x22\K.*/\n}/s" file
解釋
隨著
-p程式(之間"")一次應用于一行。所以要一次匹配多行,這里需要,我們需要將整個檔案讀入一個字串,做什么-0777;那么我們應用代碼的“行”就是整個檔案。請參閱perlrun 中的命令開關在這里,我們仍然需要啟用修飾符
.來匹配換行符,它通常不匹配。/s請參閱perlre 中的修飾符由于
"在 Windows 中分隔程式文本,因此我使用\x22(十六進制)作為"代碼中的字符。(在我在 Linux 上進行的測驗中,轉義它\"不起作用,但它可能在 Windows 上作業,我現在無法測驗。)洗掉(“忘記”)在
\K該點之前都匹配,因此它們不會從字串中消耗;所以我們不必在更換部件中重新輸入它們。因此,除了所需的換行符和結束分隔符之外,僅將以下.*內容替換為 , 。\n}參見perlre 中的 \K
請參閱教程perlretut
出現了一個問題,即如何在 Windows 中將檔案串列傳遞給這個命令列程式,就像*.vpcf在 Unix 世界中所做的那樣(所有以 結尾的檔案.vpcf)。
這是 Windows shell(s) 的問題,cmd.exe在 Windows 中不是一件簡單的事情,但在 PowerShell 中卻是這樣。所以這是使用 PowerShell 的一種方法。
另一方面,可以讓 Perl 程式這樣做——向它傳遞一個模式來構建檔案名,比如擴展名,讓它構建一個檔案串列,讀取、編輯和寫回檔案。那么該程式將比上面的單行程式涉及更多,但仍然相當基本。
這是一個快捷方式,仍將其保留為簡短的命令列程式(“單線”)
perl -wE'@ARGV = glob qq($ARGV[0]); $^I = qq(.bak); while (<>) { s/.../.../s; print }' *.vpcf
(與上述相同的正則運算式)
評論
檔案串列是使用glob從呼叫時傳遞給程式的內容(其
@ARGV陣列中的第一個引數)構建的,然后分配給@ARGV(供<>稍后使用)要模擬
-i.bak一個可以使用$^I 變數while (<>)從 中列出的每個檔案中取一行@ARGV。(通常這些是來自命令列的東西,但現在我們明確分配給@ARGV.)參見<> 運算子我將
qq運算子用于雙引號,因為"它是 Windows 命令列上的分隔符
(我現在無法在 Windows 上測驗)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/464659.html
標籤:perl
上一篇:從perl呼叫和控制GDB
