在bash我有这样的字符串,请注意第一行,最后一行是空白。
如何获得300号码和20号码?
#first blank line
Found 300 modems:
/org/freedesktop/ModemManager1/Modem/20 [huawei] E3131
/org/freedesktop/ModemManager1/Modem/1 [huawei] E3131
/org/freedesktop/ModemManager1/Modem/0 [huawei] E303
#last blank line
答案 0 :(得分:1)
这是一个Perl版本......
perl -ne 'if(m[Found (\d+)] || m[Modem/(\d+)]) {print "$1\n"}' < file_name
请注意。你可以使用以下脚本top play与正则表达式...
#!/usr/bin/perl
use strict;
use warnings;
while(<DATA>) {
if(m[Found (\d+)] || m[Modem/(\d+)]) {
print "$1 \n";
}
}
__DATA__
#first blank line
Found 300 modems:
/org/freedesktop/ModemManager1/Modem/20 [huawei] E3131
/org/freedesktop/ModemManager1/Modem/1 [huawei] E3131
/org/freedesktop/ModemManager1/Modem/0 [huawei] E303
#last blank line
如果您将该脚本保存为test.pl
,则可以像这样使用它......
perl -ne 'if(m[Found (\d+)] || m[Modem/(\d+)]) {print "$1\n"}' < test.pl
我得到了以下输出......
300
20
1
0
答案 1 :(得分:0)
如果您将该输出存储在名为${var}
的变量中,则可以执行
sed -n 's/Found \([0-9]*\) modems:/\1/p' <<< "${var}"
sed
遍历字符串中的所有行,-n
会抑制输出。如果我们找到Found n modems:
的行,我们将其替换为仅数字(s
命令)并打印行(p
标志)。
答案 2 :(得分:0)
这将打印300,20,1和0:
sed -ne 's/Found \(.*\) modems:/\1/p' -e 's:.*Modem/\([^ ]*\) .*:\1:p' FILENAME
-n
表示默认情况下不打印输出
-e COMMAND
执行COMMAND。你可以多次使用它
使用s
结束p
命令表示如果发生任何替换,则打印。
运行man sed
了解详情。
如果您真的只想要300和20作为输出,请附加|head -2
以限制输出到前两行。