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