我无法将grep中使用的Perl正则表达式转换为perl语法
#/bin/bash
string="Last logical block address=936640511 (0x37d3ffff), Number of blocks=936640512"
echo $string | grep -Po '(?<=blocks=)[^$]*'
Run Code Online (Sandbox Code Playgroud)
用perl,我无法成功
#!/usr/bin/perl
my $string="Last logical block address=936640511 (0x37d3ffff), Number of blocks=936640512";
my ($blocks) = $string =~ m/(?<=blocks=)[^$]*/;
print $blocks;
Run Code Online (Sandbox Code Playgroud)
如果我使用正确的正则表达式,请建议.
列表上下文中的匹配运算符返回捕获的文本(如果有),因此您需要做的就是在要返回的位周围添加捕获(parens).
my ($blocks) = $string =~ /(?<=blocks=)([^$]*)/;
print "$blocks\n";
Run Code Online (Sandbox Code Playgroud)
看起来只是让你失望.
my ($blocks) = $string =~ /blocks=([^$]*)/;
print "$blocks\n";
Run Code Online (Sandbox Code Playgroud)
我们应该检查一下匹配是否成功.
if ( my ($blocks) = $string =~ /blocks=([^$]+)/ ) {
print "$blocks\n";
}
Run Code Online (Sandbox Code Playgroud)
但我很困惑为什么你要匹配美元符号以外的字符.您可能想要匹配换行符以外的字符.
if ( my ($blocks) = $string =~ /blocks=([^\n]+)/ ) {
print "$blocks\n";
}
Run Code Online (Sandbox Code Playgroud)
鉴于您没有使用/s,也可以编写
if ( my ($blocks) = $string =~ /blocks=(.+)/ ) {
print "$blocks\n";
}
Run Code Online (Sandbox Code Playgroud)
就个人而言,我会用
if ( my ($blocks) = $string =~ /blocks=(\S+)/ ) {
print "$blocks\n";
}
Run Code Online (Sandbox Code Playgroud)
要获得所有比赛,这只是一个使用问题/g.
for my $blocks ( $string =~ /blocks=(\S+)/g ) {
print "$blocks\n";
}
Run Code Online (Sandbox Code Playgroud)