regex - 如何使用此正则表达式匹配最后一个字符串

标签 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((?=")(.*)(?=;))

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

最佳答案

您在正则表达式 ( (?=...) ) 中使用了先行断言,即 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激活对扩展正则表达式的支持,其功能更多像其他语言中的正则表达式(没有-rsed只支持基本正则表达式,其特征集有限且转义规则不同)。

  • -n默认情况下禁止打印每个输入行,因此需要显式输出命令才能产生输出。

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

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

关于regex - 如何使用此正则表达式匹配最后一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38427894/

相关文章:

linux - 如何在嵌入式 Linux 启动时启动 init.d 脚本。我没有 update-rc.d。还有其他方法可以在 linux 启动时启动 init.d 脚本吗?

linux - 当我在 Linux 上编译时在 bash 中设置 tenv

javascript - 修改现有的 url 验证正则表达式以在 javascript 中接受更多 url

linux - 无法使用Java代码在Linux运行时创建文件

linux - 无法在 Docker 容器中使用 sudo 编辑环境文件

java - 无法使用 Java 运行 bash shell

windows - 环境 : bash\r: No such file or directory

c# - 如何使用 C# 和正则表达式删除引号 (") 内的所有逗号

ruby - 将字符串数组分类为关闭正则表达式

C# 制表符/缩进 HTML