所以我有一句话:
ID: 54376
你能帮我制作一个只返回不带“ID:”的数字的正则表达式吗?
笔记:该字符串位于一个文件中。
答案1
尝试这个:
grep -oP '(?<=ID: )[0-9]+' file
或者:
perl -nle 'print $1 if /ID:.*?(\d+)/' file
答案2
有许多这样做的方法。例如:
将 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]*'
答案3
使用egrep
with-o
或grep
with-Eo
选项仅获取匹配的段。使用[0-9]
正则表达式来获取数字:
grep -Eo [0-9]+ filename
答案4
使用 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