使用perl在文本文件中变量值的一个线性增量
one liner increment of variable value in text file using perl
我在 perl 程序的文件中有变量。我只想增加 $[0] as $[1] $[2]
的垂直位置的值,因为每个 $[0] 变量现在都具有从 64 到 utf-8 的值。
我只想更改 $[0] 以增加值直到文件结束。
我试过前面提到的 perl 命令
perl -pi -e 's/U[0](\d+)[0].(+1)/e' 25k.list
syntax error at -e line 1, near "](" Unmatched [ in regex; marked by
<-- HERE in m/ <-- HERE ,/ at -e line 1.
已添加:
文件中的一些数据:
$U[0] = "\data1\fileloader.ini";
$U[0] = "\data1\data2\crame\crame.ini";
$U[0] = "\data1\data2\data3\files\setup.exe";
$U[0] = "\data1\data2\data3\data4\WINDOWS\win.ini";
我想要的,增加$U[从0开始,直到不再出现],应该是:
$U[0] = "\data1\fileloader.ini";
$U[1] = "\data1\data2\crame\crame.ini";
$U[2] = "\data1\data2\data3\files\setup.exe";
$U[3] = "\data1\data2\data3\data4\WINDOWS\win.ini";
only affecting $U[ ]
"Syntax error" 是因为您的正则表达式缺少 /
,它应该将搜索模式与替换部分分开。此外,您想执行替换部分,我认为 []
是字面意思。所以我最好的猜测是,你的 s/p/r/ 应该是:s/U\[0\](\d+)/"U[0]".(+1)/e
适用于这种情况的 s///
表达式是:
s/$U\[0\]/"$U[".$c++."]"/ge
这意味着:用 $U[n]
替换每个出现的 $U[0]
,n
是从 0
开始的下一个整数。
请阅读:https://perldoc.perl.org/perlop.html 关于 s/PATTERN/REPLACEMENT/
。
这似乎是你想要的。
#!/usr/bin/perl
use strict;
use warnings;
my $x = 0;
while (<DATA>) {
s/U\[0]/'U[' . $x++ . ']'/e;
print;
}
__DATA__
$U[0] = "\data1\fileloader.ini";
$U[0] = "\data1\data2\crame\crame.ini";
$U[0] = "\data1\data2\data3\files\setup.exe";
$U[0] = "\data1\data2\data3\data4\WINDOWS\win.ini";
我得到的输出是:
$U[0] = "\data1\fileloader.ini";
$U[1] = "\data1\data2\crame\crame.ini";
$U[2] = "\data1\data2\data3\files\setup.exe";
$U[3] = "\data1\data2\data3\data4\WINDOWS\win.ini";
和其他答案一样,我基本上在这里做了三个修复。
- 停止
[0]
被解释为字符 class。
- 更正
s/.../.../
表达式的语法。
- 忽略
并使用递增变量作为替换整数。
我在 perl 程序的文件中有变量。我只想增加 $[0] as $[1] $[2]
的垂直位置的值,因为每个 $[0] 变量现在都具有从 64 到 utf-8 的值。
我只想更改 $[0] 以增加值直到文件结束。
我试过前面提到的 perl 命令
perl -pi -e 's/U[0](\d+)[0].(+1)/e' 25k.list
syntax error at -e line 1, near "](" Unmatched [ in regex; marked by <-- HERE in m/ <-- HERE ,/ at -e line 1.
已添加:
文件中的一些数据:
$U[0] = "\data1\fileloader.ini";
$U[0] = "\data1\data2\crame\crame.ini";
$U[0] = "\data1\data2\data3\files\setup.exe";
$U[0] = "\data1\data2\data3\data4\WINDOWS\win.ini";
我想要的,增加$U[从0开始,直到不再出现],应该是:
$U[0] = "\data1\fileloader.ini";
$U[1] = "\data1\data2\crame\crame.ini";
$U[2] = "\data1\data2\data3\files\setup.exe";
$U[3] = "\data1\data2\data3\data4\WINDOWS\win.ini";
only affecting $U[ ]
"Syntax error" 是因为您的正则表达式缺少 /
,它应该将搜索模式与替换部分分开。此外,您想执行替换部分,我认为 []
是字面意思。所以我最好的猜测是,你的 s/p/r/ 应该是:s/U\[0\](\d+)/"U[0]".(+1)/e
适用于这种情况的 s///
表达式是:
s/$U\[0\]/"$U[".$c++."]"/ge
这意味着:用 $U[n]
替换每个出现的 $U[0]
,n
是从 0
开始的下一个整数。
请阅读:https://perldoc.perl.org/perlop.html 关于 s/PATTERN/REPLACEMENT/
。
这似乎是你想要的。
#!/usr/bin/perl
use strict;
use warnings;
my $x = 0;
while (<DATA>) {
s/U\[0]/'U[' . $x++ . ']'/e;
print;
}
__DATA__
$U[0] = "\data1\fileloader.ini";
$U[0] = "\data1\data2\crame\crame.ini";
$U[0] = "\data1\data2\data3\files\setup.exe";
$U[0] = "\data1\data2\data3\data4\WINDOWS\win.ini";
我得到的输出是:
$U[0] = "\data1\fileloader.ini";
$U[1] = "\data1\data2\crame\crame.ini";
$U[2] = "\data1\data2\data3\files\setup.exe";
$U[3] = "\data1\data2\data3\data4\WINDOWS\win.ini";
和其他答案一样,我基本上在这里做了三个修复。
- 停止
[0]
被解释为字符 class。 - 更正
s/.../.../
表达式的语法。 - 忽略
并使用递增变量作为替换整数。