我正在处理一个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((?=")(.*)(?=;))
到目前为止,我的正则表达式匹配除了最后一个分号之外的所有内容。如何修改正则表达式以捕获分号?
答案 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
)中定义的。
基本方法是匹配整行,但将(唯一的)捕获组限制为感兴趣的子字符串,然后仅使用捕获组替换该行,这有效地仅输出每个感兴趣的子字符串匹配线。