具有任何字符的正则表达式,也许空格不起作用

Regex with any character and maybe a space not working

提问人:ecotechie 提问时间:9/28/2023 最后编辑:ecotechie 更新时间:9/28/2023 访问量:52

问:

我正在为此使用 sed,但它与其他正则表达式大致相同。

尝试从 WordPress wp-config.php 文件中获取DB_NAME,在本例中为测试。此外,我无法控制是否使用单引号 (') 或双引号 (“)。空间可能存在...因此,以下是我可以期待的一些示例:

define( 'DB_NAME', 'test' );
define('DB_NAME','test');
define( "DB_NAME", "test" );

这是我正在使用的:

sed -E -n "s/define\([[:space:]]?.DB_NAME.,[[:space:]]?.(.*).[[:space:]]?\);/\1/p" wp-config.php

这是输出:

test'
test
test"

在最后一个 [[:space:]] 之后使用 ,只有第二行返回预期的测试。其他人附加了引号。

为什么?难道不应该 . 抓住引号和[[:space:]]? 抓住一个空间,如果它在那里?

我知道我可以使用:

['\|\"]

捕获任何一个引号而不是点,但想知道为什么会这样......

正则表达式 Linux WordPress SED

评论

0赞 Reilas 9/28/2023
尝试 --regexp-extended 开关。
0赞 Ed Morton 9/28/2023
如果实际输入文件中的行并不总是包含,请更新问题中的示例以使其更逼真。如果他们这样做,那么你不需要在脚本中测试。defineDB_NAMEdefineDB_NAME

答:

1赞 Diego Torres Milano 9/28/2023 #1

你可以使用awk

awk -F "['\"]*" '{print $4}' file.php
test
test
test

评论

0赞 Ed Morton 9/28/2023
我怀疑 OP 真的需要测试,他们的样本输入/输出不足以证明他们的真正问题。defineDB_NAME
0赞 Diego Torres Milano 9/28/2023
可能,但如果需要,他们可以在此基础上构建解决方案
1赞 Shawn 9/28/2023 #2

捕获引号,parens 的外部捕获尾随空格,然后匹配 0 个字符。尝试这样的事情:(.*).[[:space:]]?

 sed -E -n "s/define\([[:space:]]?.DB_NAME.,[[:space:]]?['\"](.*)['\"][[:space:]]?\);/\1/p"
input.txt
test
test
test