我试图在bash中编写一个脚本,它从PHP文件中提取数据库名称。例如,我想从下面的行复制CRM_123456789:
$ sugar_config [' dbconfig'] [' db_name'] =' CRM_123456789';
我尝试过使用sed,所以基本上我想复制它们之间的文本 [' db_name'] =' 和 &#39 ;;
sed -n '/['db_name'] = /,/';/p' myfile.php
然而,这不会返回任何东西。有谁知道我做错了什么?
由于
答案 0 :(得分:1)
您无法嵌套单引号。您的表达式评估为不带引号的/[
旁边的单引号db_name
,其中您希望在文字单引号上匹配。
一种解决方法是使用双引号进行最外层引用,但请确保进行必要的更改,因为双引号比shell中的单引号弱。在你的情况下,在这方面没有什么可以改变的。
但是,您似乎也误解了sed
地址表达式的工作原理。它们识别行,而不是行上的子串。因此,您的脚本会在匹配['db_name']
的行和符合';
的行之间打印。要从一行中提取某些内容,常见的习惯用法是替换掉你不想要的部分,然后打印剩下的部分。
另外,因为在sed
中打开方括号是元字符,所以你需要反斜杠 - 将其转义为字面上匹配。
sed -n "s/.*\['db_name'] = '\([^']*\)'.*/\1/p" myfile.php
这匹配到['db_name'] = '
,然后将单引号字符串中的任何内容捕获到\1
,然后匹配下一个单引号到行尾的任何内容,并将其替换为仅捕获字符串;并在执行替换后打印该行。
如果配置文件支持变量空格,那么有用的改进是允许在等号周围可选的空格,也可能在方括号内。 [ ]*
将匹配零个或多个空格(方括号在单个空格周围是非常必要的,但出于可读性原因我将它们包括在内)。
答案 1 :(得分:0)
您可以尝试以下sed命令。
$ sed -n "s/.*\['db_name'\] = '\([^']*\)';.*/\1/p" file
CRM_123456789