sed专家的另一个问题。
我有一个表示路径名的字符串,其中包含两个数字。一个例子是:
./pentaray_run2/Trace_220560.dat
我需要提取这些数字中的第二个 - 即220560
我(在论坛的帮助下)能够一起提取所有数字(即2220560):
sed "s/[^0-9]//g"
或仅提取第一个数字:
sed -r 's|^([^.]+).*$|\1|; s|^[^0-9]*([0-9]+).*$|\1|'
但我所追求的是第二个数字!!任何帮助非常感谢。
PS我所追求的数字始终是字符串中的第二个数字。
答案 0 :(得分:14)
这样可以吗?
sed -r 's/.*_([0-9]*)\..*/\1/g'
以你的例子:
kent$ echo "./pentaray_run2/Trace_220560.dat"|sed -r 's/.*_([0-9]*)\..*/\1/g'
220560
答案 1 :(得分:7)
如果欢迎grep
:
$ echo './pentaray_run2/Trace_220560.dat' | grep -oP '\d+\D+\K\d+'
220560
使用相同的正则表达式Perl
更具便携性:
echo './pentaray_run2/Trace_220560.dat' | perl -lne 'print $& if /\d+\D+\K\d+/'
220560
我认为这种方法更清洁&比使用sed
答案 2 :(得分:7)
你可以用这个提取最后的数字:
sed -e 's/.*[^0-9]\([0-9]\+\)[^0-9]*$/\1/'
更容易想到这一点:
比赛的第3部分是“魔术”发生的地方,但它也限制你的比赛在数字之前至少有一个非数字(即你不能匹配只有一个数字的字符串)字符串的开头,虽然有一个简单的解决方法,可以在字符串的开头插入一个非数字。)
神奇的是反击.*
的左右贪婪(第4部分)。如果没有第3部分,第4部分将尽其所能消耗,包括数字,但有了它,匹配确保它停止,以便至少允许第1和第2部分使用非数字后跟数字,允许捕获数字。
答案 3 :(得分:5)
这可能适合你(GNU sed):
sed -r 's/([^0-9]*([0-9]*)){2}.*/\2/' file
这会提取第二个数字:
sed -r 's/([^0-9]*([0-9]*)){1}.*/\2/' file
这将摘录第一个。