sedは、文字列部分を切り捨てるためにワイルドカードを貪欲に一致させません。

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

これが出力です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/ *=>.*//'

上記はsedyourgrepと will を置き換え、一致する各行に対して最初の行の前のextensions_dirすべての項目を削除し、最初の行/から=>すべてを削除します。修正済みひも。以前のスペース=>もすべて削除されます。一致しない行はextensions_dir無視されます。

これにより、入力の最初の行に必要なパスが返され、2番目の行に空の行が返されます。

入力の2行目を無視するには、/^extension_dir/代わりに上記を使用してください。 2行目はその文字列で始まらないので削除されます。/extension_dir/sed


sed2番目の入力行に対して素晴らしい結果を生成する2つのスクリプトの組み合わせ。

ラインは

sqlite3.extension_dir => no value => no value

最初は、sed次のように修正します。

sqlite3.no value => no value

次に2番目は最後のビットをsed削除します。=> no value


気づく

echo $( ... )

内部コマンド出力で改行文字を食べるので役に立ちません$( ... )。代わりに、コマンドの置き換えを使用するechoか、置き換えることなくコマンドのみを使用してテストします$( ... )

echoandの出力特性(1つではなく2つの一致する行)を混乱させることは、これらの使用法かもしれません。php -igrep

おすすめ記事