Bash
如何找到與 sed(或類似)匹配的配置參數?
我很擅長使用 php 的
preg_match
(和類似的)命令,我也很擅長使用正則表達式,但我對sed
.我正在處理兩個 shell 腳本,我希望能夠從配置文件中提取一些變數。
第一個文件
第一個文件是一個
.htaccess
文件,我想獲取網址,它將位於如下所示的塊中: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,我是否會更好地使用另一個命令?第二個文件
第二個文件有點不同,因為它是一個
.ini
文件,所以我想知道是否可能有一些 shell 魔法(我使用bash
)來解析它。我想要的塊看起來像這樣:[Database] database = mysql://user:password@localhost/database
如果我使用 PHP 和正則表達式,我會這樣做:
#\s+database\s*=\s*mysql://([\:]+):([\@]+)@([\/]+)/(.*?)\s+#is
在 PHP 中有一個 .ini 解析器,但我希望這是一個 shell/bash 腳本,而不是 PHP 腳本
如何使用該正則表達式來獲取數據庫連接憑據?
如果您想使用類似 perl 的正則表達式,為什麼不使用 perl(在 99% 的非嵌入式 Unices 上都可以找到它)?
像:
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``$_