【问题标题】:extract text from file using sed使用 sed 从文件中提取文本
【发布时间】:2015-02-19 09:39:43
【问题描述】:

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

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

我尝试过使用 sed,所以基本上我想在 ['db_name'] = ' 和 ';

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

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

谢谢

【问题讨论】:

  • 您可以使用 sed 执行此操作,但该方法非常容易出错。例如,您最好使用PHP Tokenizer

标签: bash sed


【解决方案1】:

您不能嵌套单引号。您的表达式计算为单引号 /[ 旁边未引用的 db_name 显然您想匹配文字单引号。

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

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

此外,由于左方括号是sed 中的元字符,因此您需要反斜杠转义它以匹配它。

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

这匹配到['db_name'] = ',然后将单引号字符串中的任何内容捕获到\1,然后匹配从下一个单引号到行尾的任何内容,并仅用捕获的字符串替换它;并在执行替换后打印该行。

如果配置文件支持可变空格,一个有用的改进是允许等号周围的可选空格,也可能在方括号内。 [ ]* 将匹配零个或多个空格(方括号在单个空格周围并不是必需的,但出于易读性原因,我将它们包括在此处)。

【讨论】:

  • 感谢您的详细解释,非常感谢。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 2012-07-01
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 2020-09-26
    • 2011-08-14
    相关资源
    最近更新 更多