2017-07-26 51 views
2

只有第一次出現我有文件settings.inc.php,內容如下:的sed:如何提取的價值

<?php 
define('_DB_SERVER_', 'mariadb'); 
define('_DB_NAME_', 'organic'); 
define('_DB_USER_', 'prestashop'); 
define('_DB_PASSWD_', 'prestashop'); 

我想這些值提取到bash,所以我設法創建以下命令:

sed -rn 's/^.*_DB_NAME_'\'', '\''(\w+)'\''\);/\1/p' settings.inc.php 

這將返回organic,就像它應該那樣,但我想進一步改進它。比方說,我們會有這種文件:

<?php 
define('_DB_SERVER_', 'mariadb'); 
define('_DB_NAME_', 'organic1'); 
define('_DB_NAME_', 'organic2'); 
define('_DB_USER_', 'prestashop'); 
define('_DB_PASSWD_', 'prestashop'); 

該文件使用上面的命令,我們將得到:

organic1 
organic2 

的事情是:我想爲這個命令總是隻返回一個值,所以讓我們說第一個。我能否在沒有管道結果的情況下實現這一目標?

回答

0

如果您將您的替換命令,然後打印到命令塊僅由圖案處理流水線作業(含)_DB_NAME_,你可以第一個匹配/打印後退出:

$ sed -rn "/_DB_NAME_/ { s/.*'(\w+)'\);$/\1/p;q }" settings.inc.php 
organic1 

注意q命令之後p

此外,您的sed腳本可以通過使用外部雙引號和錨定結尾進行簡化。

0

管你sed命令head和選擇第一行,如下所示:

sed -rn 's/^.*_DB_NAME_'\'', '\''(\w+)'\''\);/\1/p' settings.inc.php | head -1 
1

隨着GNU的grep你可以做到這一點:

grep -m1 -Po "_DB_NAME_', '\K[^']+" settings.inc.php 

grep的參數是:

  • -m 1:1場比賽後停止搜索
  • -P:打開Perl的風格的正則表達式(所以我們可以在這裏使用\K
  • -o:只有打印模式

圖案的\K部分說,不包括符合線的一部分作爲比賽的一部分,所有的事情都會發生,然後我們可以通過模式的其餘部分找到並非'的所有內容。

如果你想與sed堅持,你可以找到_DB_NAME_線,然後退出後,你發現它:

sed -rn '/_DB_NAME/ {s/^.*_DB_NAME_'\'', '\''(\w+)'\''\);/\1/;p;q}' settings.inc.php 

它匹配_DB_NAME_然後進入,做你的s ubstitution塊,p rints行,然後q UITS

2

也可以使用awk

$ awk -F "'" '$2=="_DB_NAME_"{print $4; exit}' settings.inc.php 
organic1 
  • -F "'"使用單引號作爲輸入字段分隔
  • $2=="_DB_NAME_"檢查,如果第二字段是_DB_NAME_
  • print $4如果條件滿足,打印第四字段
  • exit因爲只有第一匹配需要