如何使用此REGEX匹配最后一个字符串

时间:2016-07-18 02:42:40

标签: regex linux bash

我正在处理一个bash脚本,需要使用SED和REGEX来匹配文本文件中的这一行:

database.system = "pgsql://hostaddr=127.0.0.1 port=5432 dbname=mydb user=myuser password=mypassword options='' application_name='myappname'";

这是我提出的正则表达式:

database.system\s=\s((?=")(.*)(?=;))

到目前为止,我的正则表达式匹配除了最后一个分号之外的所有内容。如何修改正则表达式以捕获分号?

1 个答案:

答案 0 :(得分:0)

您在正则表达式((?=...))中使用了前瞻性断言,sed不支持。

但是,你不需要它们,如果你要做的就是在双引号内提取字符串(使用 GNU sed语法):

line=$'database.system = "pgsql://hostaddr=127.0.0.1 port=5432 dbname=mydb user=myuser password=mypassword options=\'\' application_name=\'myappname\'";'

sed -rn 's/database\.system\s*=\s*"(.*)";/\1/p' <<<"$line"
# use var=$(sed ...) to capture command output in a variable.

将提取

pgsql://hostaddr=127.0.0.1 port=5432 dbname=mydb user=myuser password=mypassword options='' application_name='myappname'
  • -r激活对扩展正则表达式的支持,这些正则表达式的函数 more 就像其他语言中的正则表达式一样(没有-r,{ {1}}仅支持基本正则表达式,其功能集有限且转义规则不同。

  • sed默认禁止打印每个输入行,因此需要显式输出命令才能生成输出。

  • -n匹配s/<regex>/<replacement>/p的每个输入行,将其替换为<regex>,并打印结果(<replacement>),但仅在找到匹配项时; p是指第一个(也是唯一一个)捕获组(\1)中定义的。

基本方法是匹配整行,但将(唯一的)捕获组限制为感兴趣的子字符串,然后仅使用捕获组替换该行,这有效地仅输出每个感兴趣的子字符串匹配线。