我想將一行的第 n 個字符替換為 '.',其中 n 取決于行并且可以在行本身上提供,例如,示例檔案可能如下所示:
$cat test
0 ABCD
1 ABCD
2 ABCD
所需的輸出是
0 .BCD
1 A.CD
2 AB.D
3 ABC.
我嘗試捕獲數字并在 {} 中使用 \1,但它不起作用:
$ cat test | perl -pe 's/([0-9]) ([A-Z]{\1})./\1 \2./'
0 ABCD
1 ABCD
2 ABCD
而在 {} 中使用普通數字會給出所需的輸出:
$ cat test | perl -pe 's/([0-9]) ([A-Z]{2})./\1 \2./'
0 AB.D
1 AB.D
2 AB.D
使用perl(而不是sed),因為我知道在模式中使用捕獲組原則上是有效的:
$ echo 'KALLO' | perl -pe 's/([A-Z])\1/__/'
KA__O
所以我的問題是:為什么我的方法{\1}不起作用?如何在不使用回圈的情況下實作我想要的?
uj5u.com熱心網友回復:
Perl 期望在 之后有一個數字{,而不是反斜杠。
但是,您可以從變數構建模式,并在替換中使用它:
perl -pe '/^([0-9] )/; $p = "(.* .{$1})."; s/$p/$1./'
甚至,在 Perl 5.010
perl -pe '/^([0-9] )/; $p = ".* .{$1}\\K."; s/$p/./'
uj5u.com熱心網友回復:
\1意思是“匹配第一次捕獲的內容”。在哪里使用它沒有任何意義。
(??{ })可用于。
$ perl -ple's/^(\d) \s (??{ "." x $1 }) \K . /./sxa' test
0 .BCD
1 A.CD
2 AB.D
我會怎么做:
$ perl -ple'
my @F = split " ", $_, 2;
substr( $F[1], $F[0], 1 ) = ".";
$_ = join " ", @F;
' test
0 .BCD
1 A.CD
2 AB.D
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/463587.html
下一篇:如何在警報關閉時觸發關閉
