我有:
Aenean placerat >> /example/alpha.txt
est et rutrum ultrices >> /example/beta.txt
dolor nibh ultricies nulla >> /example/gamma delta.txt
我需要:
Aenean placerat >> \/\e\x\a\m\p\l\e\/\a\l\p\h\a\.\t\x\t
est et rutrum ultrices >> \/\e\x\a\m\p\l\e\/\b\e\t\a\.\t\x\t
dolor nibh ultricies nulla >> \/\e\x\a\m\p\l\e\/\g\a\m\m\a\ \d\e\l\t\a\.\t\x\t
顯然這不起作用,但我找不到實作這一目標的方法......
's/(.*) >> (.)*/$1 >> \\$2/gm'
uj5u.com熱心網友回復:
一種快速簡單的方法是在您的正則運算式替換中應用正則運算式替換。
use strict;
use warnings;
while (<DATA>) {
s/>> \K(. )/ $1 =~ s#(.)#\\$1#gr /e;
# ^^^^^^^^^^^^^^^^^^^ inner substitution
print;
}
__DATA__
Aenean placerat >> /example/alpha.txt
est et rutrum ultrices >> /example/beta.txt
dolor nibh ultricies nulla >> /example/gamma delta.txt
( /eeval) 修飾符告訴 Perl 將 RHS 評估為代碼。請注意在內部替換運算子上使用替代分隔符s###,以及使用/r修飾符僅回傳值(無論如何我們不能修改只讀變數)。轉義允許我們“\K保留”正則運算式匹配的剩余內容。
這可以用作簡單的單線:
perl -pe's/>> \K(. )/ $1 =~ s#(.)#\\$1#gr /e' yourfile.txt
uj5u.com熱心網友回復:
您可以在第一次出現 >> 之后匹配每個字符,然后使用\K清除到目前為止匹配的內容\G以匹配其后的每個字符。
(?:^.*?>>\h*|\G(?!^))\K.
解釋
(?:輪換的非捕獲組^.*?>>\h*匹配直到第一次出現>>后跟可選的水平空白字符|或者\G(?!^)在上一個匹配的末尾斷言位置,而不是在字串的開頭
)關閉非捕獲組\K忘記到目前為止匹配的內容.匹配單個字符
請參閱正則運算式演示或perl 演示。
在替換中使用前面的完整匹配\
例子
use strict;
use warnings;
while (<DATA>) {
s/(?:^.*?>>\h*|\G(?!^))\K./\\$&/g;
print;
}
__DATA__
Aenean placerat >> /example/alpha.txt
est et rutrum ultrices >> /example/beta.txt
dolor nibh ultricies nulla >> /example/gamma delta.txt
輸出
Aenean placerat >> \/\e\x\a\m\p\l\e\/\a\l\p\h\a\.\t\x\t
est et rutrum ultrices >> \/\e\x\a\m\p\l\e\/\b\e\t\a\.\t\x\t
dolor nibh ultricies nulla >> \/\e\x\a\m\p\l\e\/\g\a\m\m\a\ \d\e\l\t\a\.\t\x\t
uj5u.com熱心網友回復:
一種方法是將行一分為二,然后僅將替換應用于右側:
use warnings;
use strict;
while (<DATA>) {
my ($x, $y) = split /\s >>\s /;
$y =~ s/(.)/\\$1/g;
print "$x >> $y";
}
__DATA__
Aenean placerat >> /example/alpha.txt
est et rutrum ultrices >> /example/beta.txt
dolor nibh ultricies nulla >> /example/gamma delta.txt
輸出:
Aenean placerat >> \/\e\x\a\m\p\l\e\/\a\l\p\h\a\.\t\x\t
est et rutrum ultrices >> \/\e\x\a\m\p\l\e\/\b\e\t\a\.\t\x\t
dolor nibh ultricies nulla >> \/\e\x\a\m\p\l\e\/\g\a\m\m\a\ \d\e\l\t\a\.\t\x\t
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/513200.html
標籤:正则表达式perl
上一篇:Perl::將字串“yyyy.mm.dd.hh.mm.ss”翻譯成DateTime物件?
下一篇:Perl將專案推送到子陣列
