sed(または同様のエントリ)に一致する設定パラメータをどのように見つけることができますか?

sed(または同様のエントリ)に一致する設定パラメータをどのように見つけることができますか?

私はphp(および同様の)コマンドを非常によく使用しpreg_match、正規表現を使用するのは非常に上手ですがsed

私は2つのシェルスクリプトを作業しており、設定ファイルからいくつかの変数を抽出できるようにしたいと思います。

最初のファイル

最初のファイルは.htaccessファイルであり、次のブロックにあるURLを取得したいと思います。

RewriteCond %{HTTP_HOST} !^www\.mysite\.net$
RewriteRule (.*) http://www.mysite.net/$1 [R=301,L]

このファイルの構文は.htaccess非常に規則的なので、次の#.*(http.*?)\$#isようなパターンを使用する必要があるようです。

  • 正規表現
  • #で区切り
  • httpの前には0個以上の文字が続きます。
  • 貪欲ではない表記を使ってhttpでキャプチャを開始しますか?
  • 実際のドル記号が表示されるまでキャプチャを続けます(エスケープ)。
  • 一致は大文字と小文字を区別しません。
  • 空白/改行を無視

sed一致する場合は角かっこ内の部分を取得し、一致しない場合は何も(空の文字列)インポートしない場合は、このコマンドで正規表現をどのように使用できますか?

sed私が慣れているPHPのPCREに加えて、他のコマンドを使用する方が良いでしょうか?

2番目のファイル

2番目のファイルはファイルという点で若干異なるので、それを解析するために.ini使用するシェル魔法があるかどうか疑問に思います。bash私が望むブロックは次のとおりです。

[Database]
database          = mysql://user:password@localhost/database

PHPと正規表現を使用する場合は、次のようにします。

#\s+database\s*=\s*mysql://([\:]+):([\@]+)@([\/]+)/(.*?)\s+#is

PHPには.iniパーサーがありますが、PHPスクリプトではなくシェル/bashスクリプトになりたいです。

この正規表現を使用してデータベース接続資格情報を取得するにはどうすればよいですか?

ベストアンサー1

Perlに似た正規表現を使用するには、Perlを使用していますか?

良い:

perl -lne 'print for /(http.*?)\$/'

perl -lne 'print for m{database\s*=\s*mysql://([^:@]+):([^@]+)@([^/]+)/(\S+)}i'

/.../例の略語ですm/.../m/.../以外の文字など/m{...}文字ペアが許可されますm(...)

something for @listsomething$_ループをリスト値の変数として実行します。リストコンテキスト(内部的に)m{...}からキャプチャされたパターンのリストを返します。パラメータなしで印刷します。(...)print$_

おすすめ記事