使用sed从文件中提取文本

时间:2015-02-19 09:39:43

标签: bash sed

我试图在bash中编写一个脚本,它从PHP文件中提取数据库名称。例如,我想从下面的行复制CRM_123456789:

$ sugar_config [' dbconfig'] [' db_name'] =' CRM_123456789';

我尝试过使用sed,所以基本上我想复制它们之间的文本 [' db_name'] =' 和 &#39 ;;

sed -n '/['db_name'] = /,/';/p' myfile.php

然而,这不会返回任何东西。有谁知道我做错了什么?

由于

2 个答案:

答案 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