使用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
我正在尝试在 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