2013-05-03 101 views
1

我正在用Perl清理文件,並且有一行有點難以操作。如何用Perl/Regex刪除變量前的所有內容

它看起來是這樣的:

^L#$%@@$^%^3456 [rest of string] 

,但我需要前3456

的問題是,每一次的3456變化,所以我需要使用一個sed命令來擺脫一切這是非特定的。我還應該補充一點,3456之前的內容永遠不會是數字

現在s/^.*$someString/$someString/適用於使用字符串時,但同一行在不是字符串時不起作用。

無論如何,請幫忙!

+0

正則表達式需要匹配的模式,並且您還沒有真正提供足夠的工作空間。您需要移除的部分是否總是由非單詞字符組成? – melwil 2013-05-03 19:30:07

+0

它可以是除數字以外的任何內容。 – 2013-05-03 19:31:30

+0

您需要移除的垃圾量是否每次都一樣? – melwil 2013-05-03 19:33:04

回答

1

這會從該行的開頭刪除所有非數字,

s/^ \D+ //x; 
+0

完美地工作,謝謝 – 2013-05-03 19:35:27

0

你可能想要一個帶有前瞻性的正則表達式,加上非貪婪的匹配。

先行是將匹配在當前位置的圖案,但不消耗字符:

my $str = "abc"; 
$str =~ s/a(?=b)//; # $str eq "bc" 

非貪婪匹配通過附加一個?修改*+運算符。現在它會匹配儘可能少的字符。

$str = "abab"; 
$str =~ s/.*(?=b)//; # $str eq "b" 
$str = "abab"; 
$str =~ s/.*?(?=b)//; # $str eq "bab" 

爲了內插永遠都不應當被視爲一個模式的字符串,\Q...\E保護它:

$re = "^foo.?" 
$str = "abc^foo.?baz"; 
$str =~ s/^.*?(?=\Q$re\E)//; # $str eq "baz" 
0

我需要擺脫之前的一切3456

(?:(?!STRING).)*STRING[^CHAR]*CHAR,所以

s/^(?:(?!3456).)*//s; 

它也可以使用非貪婪修飾符(.*?)來完成,但我不喜歡使用它。

s/^.*?3456/3456/s; 
s/^.*?(3456)/$1/s; # Without duplication. 
s/^.*?(?=3456)//s; # Without the performance penalty of captures. 
相關問題