首页 文章

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

提问于
浏览
1

我有以下字符串:

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中,正则表达式与文本不匹配 .

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

#!/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 回答

  • 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

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

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

相关问题