Regex 如何使用此正则表达式匹配最后一个字符串
我正在编写bash脚本,需要使用SED和REGEX来匹配文本文件中的这一行:Regex 如何使用此正则表达式匹配最后一个字符串,regex,linux,bash,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((?=")(.*)(?=;)) 到目前为止,我的正则表达式与除最后
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不支持前瞻断言
但是,如果您只想提取双引号内的字符串(使用GNUsed
语法),则不需要它们:
激活对扩展正则表达式的支持,扩展正则表达式的功能更像其他语言中的正则表达式(没有-r
,-r
仅支持基本正则表达式,其功能集有限,转义规则不同)sed
默认情况下禁止打印每个输入行,因此需要显式输出命令来生成输出-n
根据s///p
匹配每个输入行,将其替换为
,并打印结果(
),但仅当找到匹配项时p
指的是中定义的第一个(在本例中是唯一的)捕获组(\1
)(…)
基本方法是匹配整行,但将(一个且唯一的)捕获组限制为感兴趣的子字符串,然后仅用捕获组替换该行,这样就可以有效地为每个匹配行只输出感兴趣的子字符串。在正则表达式中使用前瞻断言(
(?=…)
),这是sed不支持的
但是,如果您只想提取双引号内的字符串(使用GNUsed
语法),则不需要它们:
激活对扩展正则表达式的支持,扩展正则表达式的功能更像其他语言中的正则表达式(没有-r
,-r
仅支持基本正则表达式,其功能集有限,转义规则不同)sed
默认情况下禁止打印每个输入行,因此需要显式输出命令来生成输出-n
根据s///p
匹配每个输入行,将其替换为
,并打印结果(
),但仅当找到匹配项时p
指的是中定义的第一个(在本例中是唯一的)捕获组(\1
)(…)
基本方法是匹配整行,但将(一个且唯一的)捕获组限制为感兴趣的子字符串,然后仅用捕获组替换该行,这将有效地为每个匹配行只输出感兴趣的子字符串。分号不是字符串的一部分。我想,你是对的。所以我应该能用这个正则表达式过日子是吗?我身边没有机器来确认这个模式,但从外观上看是的,你应该。可能只是加上“;”插入字符串并尝试它?分号不是字符串的一部分,但我认为,你是对的。所以我应该能用这个正则表达式过日子是吗?我身边没有机器来确认这个模式,但从外观上看是的,你应该。可能只是加上“;”把它放进绳子里试一下?谢谢!这正是我想要做的。我想花点时间试着弄明白你到底做了什么,但这是可行的。“谢谢你,”基斯梅塔格巴西,我很高兴;看看我的更新是否让事情变得更清楚。谢谢你的解释,帮助我理解并节省我阅读手册页的时间(这就是我阅读你的更新时所做的)。我的目标是检索该字符串并将其传递给一个变量,稍后我将在进行db查询时使用该变量。再次感谢,谢谢!这正是我想要做的。我想花点时间试着弄明白你到底做了什么,但这是可行的。“谢谢你,”基斯梅塔格巴西,我很高兴;看看我的更新是否让事情变得更清楚。谢谢你的解释,帮助我理解并节省我阅读手册页的时间(这就是我阅读你的更新时所做的)。我的目标是检索该字符串并将其传递给一个变量,稍后我将在进行db查询时使用该变量。再次感谢。
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'