この文字列があります
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
これが出力です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
。なぜすべての一致を置き換えないのかわかりません。=> .*
私の基本的なアイデアは、最初にそれを削除してから、正規表現とは異なり、sedで一致させることができるものを含むすべてをextension_dir =>
削除することです。=>
=>
答え1
php -i | sed -n '/extension_dir/{s/^[^/]*//;s/ *=>.*$//;p;}'
または、以下のコメントで提案したように、
php -i | sed '/extension_dir/!d;s/[^/]*//;s/ *=>.*//'
上記はsed
yourgrep
と will を置き換え、一致する各行に対して最初の行の前のextensions_dir
すべての項目を削除し、最初の行/
から=>
すべてを削除します。修正済みひも。以前のスペース=>
もすべて削除されます。一致しない行はextensions_dir
無視されます。
これにより、入力の最初の行に必要なパスが返され、2番目の行に空の行が返されます。
入力の2行目を無視するには、/^extension_dir/
代わりに上記を使用してください。 2行目はその文字列で始まらないので削除されます。/extension_dir/
sed
sed
2番目の入力行に対して素晴らしい結果を生成する2つのスクリプトの組み合わせ。
ラインは
sqlite3.extension_dir => no value => no value
最初は、sed
次のように修正します。
sqlite3.no value => no value
次に2番目は最後のビットをsed
削除します。=> no value
気づく
echo $( ... )
内部コマンド出力で改行文字を食べるので役に立ちません$( ... )
。代わりに、コマンドの置き換えを使用するecho
か、置き換えることなくコマンドのみを使用してテストします$( ... )
。
echo
andの出力特性(1つではなく2つの一致する行)を混乱させることは、これらの使用法かもしれません。php -i
grep
答え2
簡単なawkソリューションを提供できます。
php -i | awk -F ' => ' '/extension_dir/{print $2; exit}'
sedを失いたい場合はこれが動作します。
編集:構文エラーを回避するためにブロック内で終了を移動し、結果ファイルパスと一緒に出力されないようにフィールド区切り文字の周りにスペースを追加し、最小文字変更制限のためにstackexchangeで編集が許可されるように、本文の変更を説明します。
答え3
パスにスペースがない場合は、次の式で十分です。
php -i | grep -Po 'extension_dir => \K/[^ ]*'
入力する
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
出力
/some/path/php/extensions/no-debug-non-zts-20160303