繁体   English   中英

正则表达式与Perl One衬板

[英]Regex with perl one liner

我有以下内容:

XXUM_7_mauve_999119_ser_11.255255

UXUM_566_mauve_999119_ser_11.255255

IXUM_23_mauve_999119_ser_11.255255

我尝试在Perl一个衬垫上提取第一个数字没有用,如下所述;

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

我期望得到以下结果:

Number 007
Number 566
Number 023

请帮助

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

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

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

这将按照您的要求进行。 它查找下划线的第一个出现,其后跟随一个十进制数字,并使用printf将数字格式化为三位数。

您可以添加-i限定词,但我建议您对其进行测试,因为它首先是保存覆盖了错误结果的数据。 当然,您可以根据需要将输出重定向到另一个文件。

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

产量

Number 007
Number 566
Number 023
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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM