我想搜索文件中的字符串以及是否找到搜索字符串 那么我想根据花括号中的值替换三行。
我正在经历堆栈溢出的解决方案之一
Perl - Insert lines after a match is found in a file 被发现的功能于一个文件
但事情对我不起作用 INPUT_FILE:
abcdef1{3} { 0x55, 0x55, 0x55 }
abcdef2{2} { 0x55, 0x55}
代码:
use strict;
use warnings;
my $ipfile = 'input.txt';
open my $my_fh "<", $ipfile or die "Couldn't open input file: $!";
while(<$my_fh>)
{
if (/$abcdef1/)
{
s/abcdef1{3} {\n/abcdef1{3} {\nabcdef1 0x55\nabcdef1 0x55\nabcdef1
0x55\n/gm;
}
}
预期产出:
abcdef1 0x55
abcdef1 0x55
abcdef1 0x55
abcdef2 0x55
abcdef2 0x55
任何有关解释的帮助都将不胜感激。
答案 0 :(得分:3)
在perlre和RE.info中注意,使用$
和{ ... }
在正则表达式中具有特殊含义。您可能看不到输出,因为您缺少至少一个print语句。除非您要验证第二个机箱中系列的长度,否则第一个卷曲机箱(即:{\d+}
)可以是可选的。
您的循环可能类似于:
while (<$my_fh>) {
if (/
^ # beginning of line
([^{]+) # the base pattern captured in $1 ("non-left curly braces")
.* # any number of characters
\{\s*(.*?)\s*\} # the data section surrounded by curlies captured in $2
$ # end of line
/x) # allow whitespace and comments
{
for my $val (split /, /, $2) {
print "$1 $val\n";
}
} else {
print;
}
}
或更简洁:
while (my $line = <$my_fh>) {
if ($line =~ /^([^{]+).*\{\s*(.*?)\s*\}$/) {
$line = '';
$line .= "$1 $_\n" for split /, /, $2;
}
print $line;
}
模式?
中的.*?
表示非贪婪匹配。在这种情况下,它避免匹配第二个右大括号旁边的空白。