我在外壳和我有这个字符串:12 BBQ ,45 rofl, 89 lol
如何使用正则表达式和shell从字符串中提取值?
使用正则表达式:\d+ (?=rofl)
,我想45
结果。
使用正则表达式从字符串中提取数据是否正确?我做的最好的是突出一些在线正则表达式编辑器的价值。大多数情况下,它会从我的字符串中删除值。
我在调查expr
,但我得到的只是语法错误。
我该如何设法在shell脚本中提取45个?
我在外壳和我有这个字符串:12 BBQ ,45 rofl, 89 lol
如何使用正则表达式和shell从字符串中提取值?
使用正则表达式:\d+ (?=rofl)
,我想45
结果。
使用正则表达式从字符串中提取数据是否正确?我做的最好的是突出一些在线正则表达式编辑器的价值。大多数情况下,它会从我的字符串中删除值。
我在调查expr
,但我得到的只是语法错误。
我该如何设法在shell脚本中提取45个?
你可以用GNU的grep的perl的方式做到这一点:
echo "12 BBQ ,45 rofl, 89 lol"|grep -P '\d+ (?=rofl)' -o
-P
意味着Perl样式,并-o
只意味着比赛。
是否有可能避免使用perl风格,因为它从山狮之后的OS X中的grep中删除? – AlexKorovyansky 2014-12-10 12:50:36
OS X的可能替代/解决方法是使用gnu grep通过自制软件,http://www.heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html。 – AlexKorovyansky 2014-12-10 12:57:50
我可以检索码头集装箱的端口号:D with'docker port c62c1c7b9efb | grep -P'(\ d +)$'-o' – 2016-09-28 21:16:26
看来你在问多个事情。要回答他们:
您可以通过捕获括号捕获来提取数字:
.*(\d+) rofl.*
,并使用$1
得到串出(.*
是“之前和之后在同一行的其余部分)
使用sed为例,这个想法成为这与只有匹配的编号替换所有字符串的文件:
sed -e 's/.*(\d+) rofl.*/$1/g' inputFileName > outputFileName
或:
echo "12 BBQ ,45 rofl, 89 lol" | sed -e 's/.*(\d+) rofl.*/$1/g'
你当然可以提取字符串的一部分,这就是分析出的数据的好方法。正则表达式的语法差别很大,所以你需要引用你正在使用的正则表达式的帮助文件。您可以尝试正则表达式,如:
[0-9]+ *[a-zA-Z]+,([0-9]+) *[a-zA-Z]+,[0-9]+ *[a-zA-Z]+
如果您正则表达式的程序可以做字符串替换,然后用您想要的结果整个字符串,你可以很容易地使用该结果。
你没有提到你是否使用bash或其他shell。在寻求帮助时,这将有助于获得更好的答案。
是的正则表达式当然可以用来提取字符串的一部分。不幸的是,不同版本的* nix和不同的工具使用的正则表达式略有不同。
这个sed命令应该在大多数的口味工作(测试OS/X和红帽)
echo '12 BBQ ,45 rofl, 89 lol' | sed 's/^.*,\([0-9][0-9]*\).*$/\1/g'
你可以使用shell(bash的举例)
$ string="12 BBQ ,45 rofl, 89 lol"
$ echo ${string% rofl*}
12 BBQ ,45
$ string=${string% rofl*}
$ echo ${string##*,}
45
你使用什么工具,你用什么壳,什么是你使用的确切命令行的,什么是错误,你得到了什么? – Abel 2010-07-23 17:00:52
恕我直言,为此目的,使用正则表达式是完全可以接受的。 – 2010-07-23 16:52:13