
私は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 @list
something
$_
ループをリスト値の変数として実行します。リストコンテキスト(内部的に)m{...}
からキャプチャされたパターンのリストを返します。パラメータなしで印刷します。(...)
print
$_
答え2
努力する
grep -oP <your_pattern> <your_file>
正規表現をPerlとして解釈し、一致する-P
ものだけを返すようにしてください。grep
-o
編集:grep
怠惰な数量子を必ずしもサポートする必要はないので、URLが複数行にわたって実行されたくない場合は、修飾/s
子なしで貪欲な数量子を使用してください。