2010-07-23 49 views
24

我在外壳和我有这个字符串:12 BBQ ,45 rofl, 89 lol如何使用正则表达式和shell从字符串中提取值?

使用正则表达式:\d+ (?=rofl),我想45结果。

使用正则表达式从字符串中提取数据是否正确?我做的最好的是突出一些在线正则表达式编辑器的价值。大多数情况下,它会从我的字符串中删除值。

我在调查expr,但我得到的只是语法错误。

我该如何设法在shell脚本中提取45个?

+1

你使用什么工具,你用什么壳,什么是你使用的确切命令行的,什么是错误,你得到了什么? – Abel 2010-07-23 17:00:52

+0

恕我直言,为此目的,使用正则表达式是完全可以接受的。 – 2010-07-23 16:52:13

回答

41

你可以用GNU的grep的perl的方式做到这一点:

echo "12 BBQ ,45 rofl, 89 lol"|grep -P '\d+ (?=rofl)' -o 

-P意味着Perl样式,并-o只意味着比赛。

+0

是否有可能避免使用perl风格,因为它从山狮之后的OS X中的grep中删除? – AlexKorovyansky 2014-12-10 12:50:36

+0

OS X的可能替代/解决方法是使用gnu grep通过自制软件,http://www.heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html。 – AlexKorovyansky 2014-12-10 12:57:50

+0

我可以检索码头集装箱的端口号:D with'docker port c62c1c7b9efb | grep -P'(\ d +)$'-o' – 2016-09-28 21:16:26

8

看来你在问多个事情。要回答他们:

  • 是的,它是确定提取使用正则表达式从字符串数据,这是他们在做什么有没有
  • 你得到的错误,你用哪一个,什么shell工具?
  • 您可以通过捕获括号捕获来提取数字:

    .*(\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

在你的例子中你不需要'。*'。如果你的正则表达式被锚定,你只需要那些边缘。未固定的,它已经可以匹配字符串内的任何位置。 – Daenyth 2010-07-23 18:16:47

+0

OP要求只取出数字,不要做成功的比赛。通过添加'。*',这是一种简单的方法来匹配所有内容,并替换匹配括号中的内容。没有他们,字符串的其余部分保持完好,这不是问(iiuc)。或者我错过了什么? – Abel 2010-07-23 18:29:40

+0

Woops,我错过了你为此使用'sed'。继续。 – Daenyth 2010-07-24 18:09:05

-1

你当然可以提取字符串的一部分,这就是分析出的数据的好方法。正则表达式的语法差别很大,所以你需要引用你正在使用的正则表达式的帮助文件。您可以尝试正则表达式,如:

[0-9]+ *[a-zA-Z]+,([0-9]+) *[a-zA-Z]+,[0-9]+ *[a-zA-Z]+ 

如果您正则表达式的程序可以做字符串替换,然后用您想要的结果整个字符串,你可以很容易地使用该结果。

你没有提到你是否使用bash或其他shell。在寻求帮助时,这将有助于获得更好的答案。

6

是的正则表达式当然可以用来提取字符串的一部分。不幸的是,不同版本的* nix和不同的工具使用的正则表达式略有不同。

这个sed命令应该在大多数的口味工作(测试OS/X和红帽)

echo '12 BBQ ,45 rofl, 89 lol' | sed 's/^.*,\([0-9][0-9]*\).*$/\1/g' 
0

你可以使用shell(bash的举例)

$ string="12 BBQ ,45 rofl, 89 lol" 
$ echo ${string% rofl*} 
12 BBQ ,45 
$ string=${string% rofl*} 
$ echo ${string##*,} 
45 
-1

您可以使用rextract来使用正则表达式提取并重新格式化结果。

例子:

[$] echo "12 BBQ ,45 rofl, 89 lol" | ./rextract '[,]([\d]+) rofl' '${1}' 
45 
+4

如果图书馆是你自己的(如“免责声明:我制作了这个图书馆”),则需要添加免责声明。从github看来,这个库/可执行文件似乎是你自己的 – Justin 2016-09-13 04:02:04

相关问题