我有以下内容:
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
请帮助
答案 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