1

我正在用 Perl 清理一个文件,我有一行很难使用。

它看起来像:

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

但我需要在3456

问题是3456每次都发生变化,所以我需要使用非特定的 sed 命令。我还应该补充一点,之前的东西3456永远不会是数字

现在s/^.*$someString/$someString/当我使用字符串时可以工作,但是当它不是字符串时,同一行不起作用。

无论如何,请帮助!

4

3 回答 3

1

这将从行首删除所有非数字,

s/^ \D+ //x;
于 2013-05-03T19:33:24.010 回答
0

您可能想要一个带有前瞻的正则表达式,加上非贪婪匹配。

前瞻是在当前位置匹配但不消耗字符的模式:

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

非贪心匹配通过附加 a 来修改*or运算符。现在它将匹配尽可能少的字符。+?

$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"
于 2013-05-03T19:32:46.207 回答
0

我需要摆脱 3456 之前的一切

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

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

也可以使用非贪婪修饰符 ( .*?) 来完成,但我不喜欢使用它。

s/^.*?3456/3456/s;
s/^.*?(3456)/$1/s;  # Without duplication.
s/^.*?(?=3456)//s;  # Without the performance penalty of captures.
于 2013-05-03T19:58:56.550 回答