我需要从更大的字符串中获取特定的字符串:
来自这些Abcd1234_Tot9012_tore.dr
或Abcd1234_Tot9012.tore.dr
我希望获得介于Tot
和_
或.
之间的数字,因此我应该得到9012
。重要的是这些数字之前和之后的字符数可能会有所不同。
有人能给我一个很好的解决方案吗?提前谢谢!
答案 0 :(得分:4)
我知道这被标记为bash / sed,但在我看来,perl对于这种任务更清楚。如果您有兴趣:
perl -ne 'print $1 if /Tot([0-9]+)[._]/' input.txt
-ne
告诉perl在输入文件上循环指定的单行,而不会默认打印任何内容。
正则表达式可读为:匹配Tot,后跟数字,后跟点或下划线;捕获数字(这是parens的用途)。因为它是第一个/捕获组,它被分配给$1
变量,然后打印出来。
答案 1 :(得分:4)
Pure Bash:
string="Abcd1234_Tot9012_tore.dr" # or ".tore.dr"
string=${string##*_Tot}
string=${string%%[_.]*}
echo "$string"
删除以'_Tot'结尾的最长的前导部分。
删除以“_”或“。”开头的最长尾随部分。
结果:
9012
答案 2 :(得分:4)
如果您只在Tot
之后查找数字,这也应该有效[srikanth@myhost ~]$ echo "Abcd1234_Tot9012_tore.dr" | awk ' { match($0,/Tot([0-9]*)/,a); print a[1]; } '
9012
[srikanth@myhost ~]$ echo "Abcd1234_Tot9012.tore.dr" | awk ' { match($0,/Tot([0-9]*)/,a); print a[1]; } '
9012
答案 3 :(得分:1)
string="Abcd1234_Tot9012_tore.dr"
num=$(awk -F'Tot|[._]' '{print $3}' <<<"$string")
string="Abcd1234_Tot9012_tore.dr"
num=$(sed 's/.*\([0-9]\{4\}\).*$/\1/' <<<"$string")
$ string="Abcd1234_Tot9012_tore.dr"; awk -F'Tot|[._]' '{print $3}' <<<"$string"
9012
$ string="Abcd1234_Tot9013.tore.dr"; sed 's/.*\([0-9]\{4\}\).*$/\1/' <<<"$string"
9013
答案 4 :(得分:1)
您可以使用perl
one-liner:
perl -pe 's/.*(?<=Tot)([0-9]{4}).*/\1/' file
<强>测试强>
[jaypal:~/Temp] cat file
Abcd1234_Tot9012_tore.dr
Abcd1234_Tot9012.tore.dr
[jaypal:~/Temp] perl -pe 's/.*(?<=Tot)([0-9]{4}).*/\1/' file
9012
9012
答案 5 :(得分:0)
使用grep
即可:
str=Abcd1234_Tot9012.tore.dr; grep -o "Tot[0-9]*" <<< $str|grep -o "[0-9]*$"
<强>输出:强>
9012
答案 6 :(得分:0)
这可能对您有用:
echo -e "Abcd1234_Tot9012_tore.dr\nAbcd1234_Tot9012.tore.dr" |
sed 's/Tot[^0-9]*\([0-9]*\)[_.].*/\n\1/;s/.*\n//'
9012
9012
这同样有效:
echo -e "Abcd1234_Tot9012_tore.dr\nAbcd1234_Tot9012.tore.dr" |
sed 's/.*Tot\([0-9]*\).*/\1/'
9012
9012