Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 带有perl单行程序的正则表达式_Regex_Perl - Fatal编程技术网

Regex 带有perl单行程序的正则表达式

Regex 带有perl单行程序的正则表达式,regex,perl,Regex,Perl,我有以下资料: 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 Number 007

我有以下资料:

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
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
输出


谢谢各位。这些解决方案是有效的,但它们也会覆盖没有这种功能的文本pattern@RobJohn:分支机构应保留不匹配的行。
else
分支机构应保留不匹配的行。非常好!非常感谢@Choroba。这非常有效。感谢您的精彩解释和代码@Brorodin。我真的很感激。谢谢@piaf为我花的时间和精力
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