我正在使用Perl清理文件,我有一行有点难以使用。
它看起来像:
^L#$%@@$^%^3456 [rest of string]
但我需要摆脱3456
问题是3456
每次都会更改,所以我需要使用非特定的sed命令。我还应该补充说3456
之前的东西永远不会是数字
现在s/^.*$someString/$someString/
在我使用字符串时起作用,但是当它不是字符串时,同一行不起作用。
无论如何,请帮忙!
答案 0 :(得分:1)
这将删除行开头的所有非数字
s/^ \D+ //x;
答案 1 :(得分: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"
答案 2 :(得分: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.