Answers:
使用egrep
with -o
或grep
with -Eo
选项仅获取匹配的句段。使用[0-9]
的正则表达式来得到的只是数字:
grep -Eo [0-9]+ filename
有很多方法可以做到这一点。例如:
将GNU grep
与最近的PCRE一起使用,并匹配以下数字ID:
:
grep -oP 'ID:\s*\K\d+' file
使用awk
并仅打印以开头的所有行的最后一个字段ID:
awk '/^ID:/{print $NF}' file
这也将打印不是数字的字段,仅获取数字,并且仅在第二个字段中使用
awk '($1=="ID:" && $2~/^[0-9]+$/){print $2}' file
将GNU grep与扩展正则表达式一起使用,并将其解析两次:
grep -Eo '^ID: *[0-9]+' file | grep -o '[0-9]*'
\K
第一个示例在做什么?
-o
用来仅打印匹配的部分,但也丢弃我不感兴趣的内容。比较echo "foobar" | grep -oP "foobar"
和echo "foobar" | grep -oP 'foo\Kbar'
sed -n '/ID: 54376/,${s/[^ 0-9]*//g;/./p}'
那将只打印ID: 54376
在任何文件输入之后出现的所有数字和空格。
我刚刚对上面的内容进行了一些更新,以便在删除非{numeric,space}字符后更快地进行处理,*
并且不使p
空白行变得粗糙。
它涉及从正则表达式线/ID: 54376/
,
通过$
最后和他们s///
删除所有或任何*
字符^
不是[^ 0-9]*
那么p
rints /
任何/
一个行.
字符剩余。
{
echo line
printf 'ID: 54376\nno_nums_or_spaces\n'
printf '%s @nd 0th3r char@cter$ %s\n' $(seq 10)
echo 'ID: 54376'
} | sed -n '/ID 54376/,${s/[^ 0-9]*//g;/./p}'
54376
1 03 2
3 03 4
5 03 6
7 03 8
9 03 10
54376
使用sed:
{
echo "ID: 1"
echo "Line doesn't start with ID: "
echo "ID: Non-numbers"
echo "ID: 4"
} | sed -n '/^ID: [0-9][0-9]*$/s/ID: //p'
的-n
是“默认不打印任何”时,/^ID: [0-9][0-9]*$/
是“匹配此正则表达式线”(开始于“ID:”,然后1个或多个数字,然后结束线的),并且s/ID: //p
具有以下形式s/pattern/repl/flags
- s
手段我们正在执行替换,请使用标志将模式"ID: "
替换为替换文本""
(空字符串)p
,这意味着“替换后打印此行”。
输出:
1
4
另一个GNU sed命令,
sed -nr '/ID: [0-9]+/ s/.*ID: +([0-9]+).*/\1/p' file
它在之后打印任何数字 ID:
+
。如果一个字符和三个字符之间的差异是您的脚本可能无法在所有代码中都起作用,则您可能sed
应该这样做:sed -n '/ID: \([0-9][0-9]*\).*/{s//\1/;s/.*[^0-9]//;/./p}'
。您的答案还会错过ID: [0-9]
包含两次出现的行中的第一个ID: [0-9]
。