我有这个字符串
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 匹配的东西与正则表达式不同。
我可以给你一个简单的awk解决方案。
php -i | awk -F ' => ' '/extension_dir/{print $2; exit}'
Run Code Online (Sandbox Code Playgroud)
如果您想丢失 sed,这将起作用。
编辑:已移动到出口内的块,以避免一个语法错误,围绕字段分隔符添加空间,以便它们将不与所得到的文件路径输出,并描述在身体的变化,因此stackexchange允许编辑由于最小字符变化的限制。
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(两条匹配行而不是一条)。
| 归档时间: |
|
| 查看次数: |
587 次 |
| 最近记录: |