从行中提取一个数字

问题描述 投票:0回答:1

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

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没有字符串),位置可以在行中改变,但它总是在“#”符号之后。

我试过这个

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

谢谢,

ksh
1个回答
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
  • 所有剩下的就是search为你的模式和print它(没有线的其余部分)当你找到它: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 - 点击左上角的“执行”按钮

© www.soinside.com 2019 - 2024. All rights reserved.