[英]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.