你能帮我从一行中提取一个数字:
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
谢谢,
答案 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;左上角的按钮