我正在编写 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
激活对扩展正则表达式的支持,其功能更多像其他语言中的正则表达式(没有-r
,sed
只支持基本正则表达式,其特征集有限且转义规则不同)。-n
默认情况下禁止打印每个输入行,因此需要显式输出命令才能产生输出。s/<regex>/<replacement>/p
将每个输入行与<regex>
匹配, 将其替换为<replacement>
,并打印结果(p
),但前提是找到匹配项;\1
指的是 中定义的第一个(也是唯一一个)捕获组 ((...)
)。
基本方法是匹配整行,但将(唯一的)捕获组限制为感兴趣的子串,然后仅用捕获组替换该行,这有效地只输出感兴趣的子串匹配线。
关于regex - 如何使用此正则表达式匹配最后一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38427894/