正则表达式在bash中不起作用,适用于其他工具

时间:2015-08-11 13:47:29

标签: regex bash

我有以下字符串:

Started GET "/stuff/search?search_string=Actin&organism_id=9&advanced_design=false&user_ip=172.16.0.1&filter=" for 172.16.0.4 at 2015-06-30 13:58:26 +0200
  Parameters: {"search_string"=>"Actin", "organism_id"=>"9", "advanced_design"=>"false", "user_ip"=>"172.16.0.1", "filter"=>""}
Started GET "/stuff/search?search_string=NM_001101&organism_id=9&advanced_design=false&user_ip=172.16.0.1&filter=" for 172.16.0.4 at 2015-06-30 14:00:39 +0200
  Parameters: {"search_string"=>"NM_001101", "organism_id"=>"9", "advanced_design"=>"false", "user_ip"=>"172.16.0.1", "filter"=>""}
Started GET "/stuff/search?search_string=ENST00000331789&organism_id=9&advanced_design=false&user_ip=172.16.0.1&filter=" for 172.16.0.4 at 2015-06-30 14:00:49 +0200
  Parameters: {"search_string"=>"ENST00000331789", "organism_id"=>"9", "advanced_design"=>"false", "user_ip"=>"172.16.0.1", "filter"=>""}

我想提取“search_string”键的值。我需要在bash脚本中执行此操作。为此,我提出了以下正则表达式:

"\{(\"search_string\"\=\>\")([a-zA-Z0-9.\-_]+)(.*?)\}"

我在多个在线正则表达式测试器上测试了这个,比如rubular或regex101.com,它在那里工作得很好。但是,在bash中,正则表达式与文本不匹配。

这是我的脚本(我已经删除了这个问题的文字,但通常是我正在写的文件中的文字):

#!/bin/bash
regex="\{(\"search_string\"\=\>\")([a-zA-Z0-9.\-_]+)(.*?)\}"
string='{"search_string"=>"NM_001101"}'
if [[ $string =~ $regex ]]
then
    echo "OK"
else
    echo "not OK"
fi

filename="/some/path/search.txt"
if [ -f "$filename" ]
then
    result=$(grep -F "$regex" "$filename")
    echo "$result"
else
    echo "$filename is not a file or it does not exist"
fi

在这种情况下,脚本会返回“not OK”。

显然,脚本尚未准备好,因为我坚持使用这个正则表达式。我做错了什么?

谢谢!

2 个答案:

答案 0 :(得分:2)

除了双引号之前的所有反斜杠之外,只需要转义所有反斜杠。

regex="\\{\"search_string\"=>\"[a-zA-Z0-9._-]+(.*?)\\}"
string='{"search_string"=>"NM_001101"}'
echo $regex
if [[ $string =~ $regex ]]
then
    echo "OK"
else
    echo "not OK"
fi

IDEONE

答案 1 :(得分:1)

此正则表达式适用于awk,因此您可以对脚本进行一些修改,并使用awk进行匹配。 awk默认情况下从stdin或文件的每一行读取行,并且正则表达式包含在" //"中,命令包含在" {}"中。在这里,我回应了你的例子,将标准输入管道传送到awk并使用命令"打印确定"测试正则表达式是否匹配。我认为您可以使用这段代码使您的脚本以bash的方式运行。

~$ echo '{"search_string"=>"NM_001101"}' | awk '/\{(\"search_string\"\=\>\")([a-zA-Z0-9.\-_]+)(.*?)\}/{print "ok"}'
ok