Bash

如何找到與 sed(或類似)匹配的配置參數?

  • November 27, 2012

我很擅長使用 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``$_

引用自:https://unix.stackexchange.com/questions/56914