获取特定字符串

时间:2012-01-02 18:22:58

标签: bash shell sed

我需要从更大的字符串中获取特定的字符串:

来自这些Abcd1234_Tot9012_tore.drAbcd1234_Tot9012.tore.dr

我希望获得介于Tot_.之间的数字,因此我应该得到9012。重要的是这些数字之前和之后的字符数可能会有所不同。

有人能给我一个很好的解决方案吗?提前谢谢!

7 个答案:

答案 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)

AWK

string="Abcd1234_Tot9012_tore.dr"
num=$(awk -F'Tot|[._]' '{print $3}' <<<"$string")

SED

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
相关问题