我有一串这样的文字:
20130312214255_HD7870Crossfire_Crysis3_1920x1080
20130312221402_HD7870Crossfire_SleepingDogs_1920x1080
20130313133415_HD7870CrossFire_Crysis3_5760x1080
我想要回归的是:
Crysis3_1920x1080
SleepingDogs_1920x1080
Crysis3_5760x1080
我对正则表达式的经验很少,可以使用一些帮助。谢谢!
答案 0 :(得分:1)
非常简短的方法,根据要求使用正则表达式:
perl -ple'($_)=/([^_]+_[^_]+$)/' file
或
perl -ple's/.*_(?=[^_]+_)//' file
(不要假设只有两个部分要删除,就像其他一些答案一样。)
答案 1 :(得分:1)
perl -lne 'print $1 if(/Crossfire_(.*)/)'
答案 2 :(得分:1)
因为您的示例中的偏移量始终相同,您还可以使用substr执行此操作:
perl -ple'$_=substr$_,31' file
答案 3 :(得分:1)
他没有说它是一个正则表达式......
use strict;
use warnings;
my $string = '20130312221402_HD7870Crossfire_SleepingDogs_1920x1080';
my ($datetime, $card, $game, $resolution) = split /_/, $string;
答案 4 :(得分:0)
对于单个字符串,您可以使用:
my $str = "20130312214255_HD7870Crossfire_Crysis3_1920x1080";
$str =~ s/^(?:[^_]*_){2}//;
如果它包含多个字符串,您可以执行以下操作:
my $str = <<'_STR_';
20130312214255_HD7870Crossfire_Crysis3_1920x1080
20130312221402_HD7870Crossfire_SleepingDogs_1920x1080
20130313133415_HD7870CrossFire_Crysis3_5760x1080
_STR_
my @result = $str =~ /^(?:[^_]*_){2}(\S+)/gm;
答案 5 :(得分:0)
一种方式:
perl -F_ -ape '$_=join "_",@F[-2,-1];' file
答案 6 :(得分:0)
根据您的示例,使用正则表达式尝试此模式
[^_ ]*_[0-9]{4}[xX][0-9]{4}
答案 7 :(得分:0)
$a="20130312214255_HD7870Crossfire_Crysis3_1920x1080";
if($a=~m/Crossfire_(.*)/){
print $1;
}