1

Perl を使用してファイルをクリーニングしていますが、作業が少し難しい行が 1 つあります。

次のようになります。

^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

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.
于 2013-05-03T19:58:56.550 に答える
0

おそらく、先読みを伴う正規表現と、貪欲ではないマッチングが必要です。

先読みは、現在の位置で一致するパターンですが、文字を消費しません:

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

非貪欲一致は、 . を追加して*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 に答える