从行中提取一个数字

时间:2018-02-28 14:23:01

标签: ksh

你能帮我从一行中提取一个数字:

M3ZBA #M440AALM 0600 02/01 HOLD 10 02/01 0:03 4 0 1 02/01/18 ; #60; -M3ZBA#IM3ZRES1-; -2 M3ZBA#IM3ZRES2-
                                                               ^^^
                                                             match these

请记住我尝试提取的数字总是在“#”符号之后,它只是一个数字(例如#980 #2987 < / strong>没有字符串),位置可以在行中改变,但它总是在“#”符号之后。

我试过这个

echo "M3ZBA #M440AALM 0600 02/01 HOLD 10 02/01 0:03 4 0 1 02/01/18 ; #60; -M3ZBA#IM3ZRES1- "| 
   awk -F"; " '{print $2}' 
# Result: #60

但是我不喜欢这个解决方案,因为它是位置解决方案,我需要一个字符串(数字)匹配解决方案。

我在7.1 ksh服务器上使用aix

谢谢,

1 个答案:

答案 0 :(得分:0)

假设该行中只有一个匹配模式,例如,您不会看到类似".... #64 ... #865 ..."的内容,我可能会使用sed去除所有内容但是你正在寻找的模式......

  • 您想要的模式是#后跟1位数字,所以这应该足够了:#[0-9][0-9]*
  • 但是,我们需要记住,#表示评论的开头,因此我们需要将其转义以将其视为字面值:\#[0-9][0-9]*
  • 将要保留的模式与\(\)括起来:\(\#[0-9][0-9]*\)
  • 使用零个或多个字符通配符(.*)匹配行的其余部分(模式之前/之后):.*\(\#[0-9][0-9]*\).*
  • 因为我们只有一个用\(\)对括起来的模式,所以这被称为模式#1,并使用转义的数字1引用:\1
  • sed通常会回显stdout的所有输入,因此我们希望以静默模式运行(即,不要将输入回显到stdout):sed -n
  • 所有剩下的就是s earch为你的模式和p rint它(没有行的其余部分)找到它:sed -n 's/.*\(\#[0-9][0-9]*\).*/\1/p'
$ echo "M3ZBA #M440AALM 0600 02/01 HOLD 10 02/01 0:03 4 0 1 02/01/18 ; #60; -M3ZBA#IM3ZRES1- " | sed -n 's/.*\(\#[0-9][0-9]*\).*/\1/p'
#60

如果您不想在输出中使用#,请将\#移至模式#1的外部,例如:

$ echo "M3ZBA #M440AALM 0600 02/01 HOLD 10 02/01 0:03 4 0 1 02/01/18 ; #60; -M3ZBA#IM3ZRES1- " | sed -n 's/.*\#\([0-9][0-9]*\).*/\1/p'
60

这是ksh fiddle - 点击“执行”&#39;左上角的按钮