正则表达式与Perl one衬里

时间:2014-11-06 13:03:28

标签: regex perl

我有以下内容:

XXUM_7_mauve_999119_ser_11.255255

UXUM_566_mauve_999119_ser_11.255255

IXUM_23_mauve_999119_ser_11.255255

并且我在perl one liner上提取第一个数字的尝试没有用,如下所示:

perl -pi -e "s/\S+_(\.+)_.+/Number$1/g" *.txt

我期待以下结果:

Number 007
Number 566
Number 023

请帮助

3 个答案:

答案 0 :(得分:1)

我使用-n选项而不是-p选项,并在代码中执行打印和格式设置:

  perl -i~ -ne 'if (($num) = /[0-9]+/g) {
                    printf "Number %03d\n", $num;
                } else {
                    print
                }' *.txt

答案 1 :(得分:1)

问题是这个正则表达式模式/\S+_(\.+)_.+/查找由下划线包围的一个或多个文字点.的序列,所以_..._之类的东西会匹配,但这样的序列不会不存在于您的文件中。我想你并不是故意逃避这一点。但即使这样,因为\S+是贪婪的,它会找到并捕获由下划线分隔的 last 字段,因此将从所有三行捕获ser。也许你打算写\d+而不是\.+,这正是我在下面写的。

这会按照你的要求行事。它查找下划线的 first 出现后跟多个十进制数字,并使用printf将数字格式化为三位数。

您可以添加-i限定符,但我建议您先测试它,因为它是第一个用错误的结果保存覆盖您的数据。当然,如果您愿意,可以将输出重定向到另一个文件。

perl -ne'/_(\d+)/ and printf "Number %03d\n", $1' myfile

<强>输出

Number 007
Number 566
Number 023

答案 2 :(得分:0)

cat > /tmp/test
XXUM_7_mauve_999119_ser_11.255255
UXUM_566_mauve_999119_ser_11.255255
IXUM_23_mauve_999119_ser_11.255255

perl -i -ne 'if ($_=~/^\w+\_(\d+)\_mauve/g) { printf "Number %03d\n", $1; }' /tmp/test

cat /tmp/test 
Number 007
Number 566
Number 023