我在理解bash shell中的正则表达式究竟是什么时遇到了问题。
我有字符串abcde 12345 67890testing
。我想使用12345
从此字符串中提取sed
。
但是,在给定字符串上使用sed -re 's/([0-9]+).*/\1/'
会给我abcde 12345
。
或者,使用sed -re 's/([\d]+).*/\1/'
实际上只会提取abcd
。
假设表达式[0-9]
和[\d]
仅捕获数字,我错了吗?我不知道如何捕获abcd
但字符67890
不是。另外,我想知道为什么在我的第一个查询中捕获空间?
此外,sed -re 's/^.*([0-9]+).*/\1/'
给了我0
。在这种情况下,我完全不明白正则表达式在做什么。我以为表达式^.*[0-9]+
只会捕获一串只有数字的第一个实例?但是,它仅匹配最后的0。
总而言之,我想了解我对这些问题的看法。如何在正则表达式中使用[\ s]来隔离第一个数字串来解决问题。
答案 0 :(得分:3)
sed -E 's/([0-9]+).*/\1/g' <<< "$s"
上面的命令意味着:找到一个数字序列,后跟一些东西,只用数字替换它。所以它匹配 12345 67890testing 并仅用 12345 替换它。
最后一个字符串将是 abcd 12345 。
如果你只想获得12345,你应该使用grep。
egrep -o '[0-9]+ ' <<< "$s"
或者使用sed,您可以使用:
sed -E 's/[a-zA-Z ]*([0-9]+).*/\1/g' <<< "$s"
这将删除数字前面的字母
答案 1 :(得分:0)
您可以使用:
sed 's/^\([0-9]*\).*$/\1/g' <<< "$s"
12345
或者修改你的sed:
sed 's/\([0-9]\+\).*/\1/g' <<< "$s"
12345
你需要逃避+
&amp; sed中的( and )
没有扩展的正则表达式标记(-r OR -E
)。
-r
它将是:
sed -r 's/([0-9]+).*/\1/g' <<< "$s"
12345
UPDATE:您实际上并不需要任何外部实用程序,因为您可以使用其正则表达式功能在BASH中执行此操作:
[[ "$s*" =~ ^([0-9]+) ]] && echo "${BASH_REMATCH[1]}"
12345
答案 2 :(得分:0)
因为其他人已经用sed,grep提供了解决方案,这里是awk代码:
echo "abcde 12345 67890testing"|awk '{for (i=1;i<=NF;i++) if ($i~/^[0-9]+$/) print $i}'