[英]From grep Perl style regex syntax to actual Perl regex pattern matching
我無法將grep中使用的Perl正則表達式轉換為perl語法
#/bin/bash
string="Last logical block address=936640511 (0x37d3ffff), Number of blocks=936640512"
echo $string | grep -Po '(?<=blocks=)[^$]*'
使用perl,我無法成功
#!/usr/bin/perl
my $string="Last logical block address=936640511 (0x37d3ffff), Number of blocks=936640512";
my ($blocks) = $string =~ m/(?<=blocks=)[^$]*/;
print $blocks;
如果我使用的是正確的正則表達式,請提出建議。
列表上下文中的match運算符將返回捕獲的文本(如果有的話),因此您要做的就是在要返回的位周圍添加捕獲(括號)。
my ($blocks) = $string =~ /(?<=blocks=)([^$]*)/;
print "$blocks\n";
后面的樣子只會使您減速。
my ($blocks) = $string =~ /blocks=([^$]*)/;
print "$blocks\n";
我們應該檢查比賽是否成功。
if ( my ($blocks) = $string =~ /blocks=([^$]+)/ ) {
print "$blocks\n";
}
但是對於您為什么要匹配除美元符號之外的其他字符,我感到困惑。 您可能打算匹配換行符以外的字符。
if ( my ($blocks) = $string =~ /blocks=([^\n]+)/ ) {
print "$blocks\n";
}
鑒於您沒有使用/s
,也可以這樣寫
if ( my ($blocks) = $string =~ /blocks=(.+)/ ) {
print "$blocks\n";
}
就個人而言,我會使用
if ( my ($blocks) = $string =~ /blocks=(\S+)/ ) {
print "$blocks\n";
}
要獲得所有匹配項,僅是使用/g
的問題。
for my $blocks ( $string =~ /blocks=(\S+)/g ) {
print "$blocks\n";
}
[^$]
模式匹配“除文字$
之外的任何字符,而不是您想要的字符串結尾”。
嘗試以下方法:
if ($str =~ m/(?<=blocks=)(.*)$/)
{
my $blocks = $1;
print $blocks;
}
您還可以打印$&
,這是與最后匹配的字符串相對應的特殊變量( man perlvar
)。 然后,您無需使用()
捕獲或$1
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.