我有兩個 perl 命令,我想應用其中一個命令來替換另一個命令中的捕獲組。
命令 1 將 CamelCase 字串轉換為 snake_case。它按預期作業:
echo 'AbcDefGhi' \
| perl -p -E 's/(?:\b|(?<=([a-z])))([A-Z][a-z] )/(defined($1) ? "_" : "") . lc($2)/eg'
結果:
abc_def_ghi
命令 2 查找需要替換的 CamelCase 字串。它也可以正常作業(在此處替換為 XXX$1YYY):
echo ' <div id="AbcDefGhi">' \
| perl -p -E 's# <div id="([^"]*)">#<div id="XXX$1YYY">#s'
結果:
<div id="XXXAbcDefGhiYYY">
但是我現在如何結合這兩個命令呢?我嘗試了很多東西,但無法讓它作業。我最好的,可能是非常糟糕的嘗試是在命令 1 中使用 e 修飾符,然后 printf "$1" 并將其通過管道傳輸到命令 2,但后來我認為它從外部 perl 命令訪問了錯誤的 $1。
理想情況下,我想讓它像這樣作業:
echo ' <div id="AbcDefGhi">' | perl -p -E 's# <div id="([^"]*)">#MAGIC#s'
結果:
<div id="abc_def_ghi">
也歡迎使用其他工具的解決方案,但我真的很想提高 perl 知識。
uj5u.com熱心網友回復:
所以基本上一個方法是找到正確的字串,另一個方法是更改??該字串。好吧,您已經在使用/e
修飾符了,那么為什么不直接在其中插入替換呢?
perl -p -E 's# <div id="([^"]*)">#
qq(<div id=") .
$1 =~ s/(?:\b|(?<=([a-z])))([A-Z][a-z] )/(defined($1) ? "_" : "") . lc($2)/egr .
qq(">)#sex'
基本上我們是這樣做的:
perl -pE' s# .... # s/...// # '
讀起來有點拗口,所以我用/x
修飾符把它分開,但你可以把它去掉,放在一行上。
請注意,我添加了/r
修飾符,因為我們不想更改$1
(我們不能,它是只讀的),我們只想要替換后的值。這就是/r
執行替換并回傳字串,但保持原始字串不變。
幸運的是,您也已經更改了分隔符,s///
所以我們甚至不需要這樣做。
出于復制/粘貼目的,這就是該行的樣子:
perl -p -E 's# <div id="([^"]*)">#qq(<div id=") . $1 =~ s/(?:\b|(?<=([a-z])))([A-Z][a-z] )/(defined($1) ? "_" : "") . lc($2)/egr . qq(">)#se'
我確信更好的方法是撰寫一個更簡單的命令,但這是合并命令的快速方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/513193.html
標籤:perl
上一篇:在perl中使用變數呼叫sed