使用sed从文件中提取文本

extract text from file using sed

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

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

我试过使用 sed,所以基本上我想在两者之间复制文本 ['db_name'] = ' 和 ';

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

然而,这 return 没有任何意义。有谁知道我做错了什么?

谢谢

不能嵌套单引号。您的表达式计算结果为未加引号 db_name 旁边的单引号 /[ ,显然您希望匹配文字单引号。

一种解决方法是对最外层的引号使用双引号,但请确保进行任何必要的更改,因为双引号在 shell 中比单引号弱。不过,在您的情况下,这方面没有任何改变。

但是,您似乎也误解了 sed 地址表达式的工作原理。它们识别 ,而不是一行中的子字符串。因此,您的脚本将在匹配 ['db_name'] 的行和匹配 '; 之间打印。要从一行中提取某些内容,常用的习惯用法是替换掉不需要的部分,然后打印剩下的部分。

此外,由于左方括号是 sed 中的元字符,您需要对其进行反斜杠转义以使其与字面匹配。

sed -n "s/.*\['db_name'] = '\([^']*\)'.*//p" myfile.php

匹配到 ['db_name'] = ',然后将单引号字符串中的任何内容捕获到 </code>,然后匹配从下一个单引号到行尾的任何内容,并将其替换为只是捕获的字符串;并在执行替换后打印该行。</p> <p>如果配置文件支持变量 whitespace,一个有用的改进是允许在等号周围使用可选的 whitespace,也可能在方括号内。 <code>[ ]* 将匹配零个或多个 space(方括号在单个 space 周围并不是必需的,但出于易读性原因,我将它们包含在此处)。

您可以试试下面的 sed 命令。

$ sed -n "s/.*\['db_name'\] = '\([^']*\)';.*//p" file
CRM_123456789