Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何使用此正则表达式匹配最后一个字符串_Regex_Linux_Bash - Fatal编程技术网

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((?=")(.*)(?=;)) 到目前为止,我的正则表达式与除最后

我正在编写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
语法),则不需要它们:

  • -r
    激活对扩展正则表达式的支持,扩展正则表达式的功能更像其他语言中的正则表达式(没有
    -r
    sed
    仅支持基本正则表达式,其功能集有限,转义规则不同)

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

  • s///p
    根据
    匹配每个输入行,将其替换为
    ,并打印结果(
    p
    ),但仅当找到匹配项时
    \1
    指的是中定义的第一个(在本例中是唯一的)捕获组(
    (…)


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

在正则表达式中使用前瞻断言(
(?=…)
),这是sed不支持的

但是,如果您只想提取双引号内的字符串(使用GNU
sed
语法),则不需要它们:

  • -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'