sed 不匹配通配符贪婪地裁剪字符串部分

sim*_*Pod 5 linux bash sed

我有这个字符串

extension_dir => /some/path/php/extensions/no-debug-non-zts-20160303 => /some/path/php/extensions/no-debug-non-zts-20160303
sqlite3.extension_dir => no value => no value
Run Code Online (Sandbox Code Playgroud)

这是输出 php -i | grep extension_dir

我如何在 bash 中解析它以获得第一个 /some/path/php/extensions/no-debug-non-zts-20160303

到目前为止,我已经尝试过:

echo $(php -i | grep extension_dir | sed 's/extension_dir => //g' | sed 's/=> .*//g')

但这给了我/some/path/php/extensions/no-debug-non-zts-20160303 sqlite3.no value。我不知道为什么它不替换所有匹配项=> .*

我的基本想法是首先摆脱,extension_dir =>而不是在第一次=>包括之后摆脱一切=>可能 sed 匹配的东西与正则表达式不同。

alp*_*pha 8

我可以给你一个简单的awk解决方案。

php -i | awk -F ' => ' '/extension_dir/{print $2; exit}'
Run Code Online (Sandbox Code Playgroud)

如果您想丢失 sed,这将起作用。

编辑:已移动到出口内的块,以避免一个语法错误,围绕字段分隔符添加空间,以便它们将不与所得到的文件路径输出,并描述在身体的变化,因此stackexchange允许编辑由于最小字符变化的限制。


Kus*_*nda 8

php -i | sed -n '/extension_dir/{s/^[^/]*//;s/ *=>.*$//;p;}'
Run Code Online (Sandbox Code Playgroud)

或者,正如下面评论中所建议的,

php -i | sed '/extension_dir/!d;s/[^/]*//;s/ *=>.*//'
Run Code Online (Sandbox Code Playgroud)

sed上述取代您grep和意志,为每个行的比赛extensions_dir,首先删除一切到第一/,然后一切从第一=>中起修改字符串。之前的所有空格=>也将被删除。行不匹配extensions_dir被忽略。

这将返回第一行输入的所需路径,第二行返回空行。

要忽略输入的第二行/^extension_dir/,请/extension_dir/sed上面使用代替。这将丢弃第二行,因为它不是以该字符串开头。


这是你两者的结合 sed脚本为第二行输入产生了令人惊讶的结果。

这条线是

sqlite3.extension_dir => no value => no value
Run Code Online (Sandbox Code Playgroud)

第一个sed将修改为

sqlite3.no value => no value
Run Code Online (Sandbox Code Playgroud)

然后第二个sed将删除最后的=> no value位。


注意

echo $( ... )
Run Code Online (Sandbox Code Playgroud)

有点没用,因为它吞噬了$( ... ). 而是仅使用没有echo$( ... )命令替换的命令进行测试。

可能是这种用法echo让您对php -iand的输出性质感到困惑grep(两条匹配行而不是一条)。