我有以下字符串:
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 回答
只需要再次使用双引号之前的所有反斜杠 .
IDEONE
此正则表达式适用于
awk
,因此您可以对脚本进行一些修改并使用awk
进行匹配 .awk
默认情况下从stdin或文件的每一行读取行,并且正则表达式包含在"//"中,命令包含在"{}"之类 . 在这里,我回应了你的例子,将stdin传送到awk
并使用命令"print ok"来测试正则表达式是否匹配 . 我认为您可以使用这段代码使您的脚本以bash的方式运行 .