你能帮我从一行中提取一个数字:
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
谢谢,
假设线上只有一个匹配的模式,例如,你不会看到类似".... #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 - 点击左上角的“执行”按钮