我嘗試在 Linux 下混合 bash 命令列工具和管道中的 Perl 命令從組態檔中過濾運算式。
我有一個組態檔(參見配置部分),可以使用 ` 過濾相關行
grep PG.DATABASE database.conf | \
sed -r -e 's/^\s*//;s/\s / /' | \
cut -d ' ' -f2 | \
sort
并得到預期的結果:
DB.GRM.CON.LOCAL.V01
DB.GRM.CON.LOCAL.V02
DB.GRM.CON.LOCAL.V03
現在我想切換到 Perl
grep PG.DATABASE database.conf | \
perl -lpe 's/^\s*//; @m = split /\s /; print $m[1]'
但是由于輸入行的重復,我得到了奇怪的結果。
DB.GRM.CON.LOCAL.V01
PG.DATABASE: DB.GRM.CON.LOCAL.V01 BEGIN
DB.GRM.CON.LOCAL.V02
PG.DATABASE: DB.GRM.CON.LOCAL.V02 BEGIN
DB.GRM.CON.LOCAL.V03
PG.DATABASE: DB.GRM.CON.LOCAL.V03 BEGIN
問題
為什么那里有重復,并且使用命令列工具實作的結果是正確的 Perl oneliner?
組態檔
PG.CONFIG: DEFAULT BEGIN
# Green Rebel Database via PG.SERVICE ------------------------
PG.DATABASE: DB.GRM.CON.LOCAL.V01 BEGIN
SERVICE: 'LOC-GRM-V0'
END.DB.GRM.CON.LOCAL.V01
# Green Rebel Database via DBI Driver ------------------------
PG.DATABASE: DB.GRM.CON.LOCAL.V02 BEGIN
DBI.PG: "dbi:Pg:dbname=grm;host=localhost;port=5432"
AUTO.COMMIT: FALSE
RAISE.ERROR: TRUE
PRINT.ERROR: FALSE
END.DB.GRM.CON.LOCAL.V02
# Green Rebel Database via Host, Db, User, Pass --------------
PG.DATABASE: DB.GRM.CON.LOCAL.V03 BEGIN
SERVER: 'localhost'
PORT: 5432
DATABASE: 'grm'
USER: ${/SYSTEM/USER}
SSL.MODE: allow
AUTO.COMMIT: FALSE
RAISE.ERROR: TRUE
PRINT.ERROR: FALSE
END.DB.GRM.CON.LOCAL.V03
END.DEFAULT
uj5u.com熱心網友回復:
我建議將-p選項(使其自動列印每一行)更改為-n. 您也可以跳過grep并讓它perl執行:
perl -lne 'if(/PG\.DATABASE/) {chomp; s/^\s*//; @m = split /\s /; print $m[1]}' database.conf
一個簡化可以是:
perl -lne 'print $1 if(/PG\.DATABASE:\s(\S )/)' database.conf
uj5u.com熱心網友回復:
您還可以讓 perl 自動拆分為列,這可能是在 perl中過濾列的正確方法:
perl -lane 'print $F[1] if $F[0] eq "PG.DATABASE:"' database.conf
DB.GRM.CON.LOCAL.V01
DB.GRM.CON.LOCAL.V02
DB.GRM.CON.LOCAL.V03
但是您的格式并不是真正面向列的,因此我會使用其他答案中的正則運算式捕獲解決方案:
perl -lne 'print $1 if(/^\s*PG\.DATABASE:\s*(\S )/)' database.conf
uj5u.com熱心網友回復:
我會做:
perl -nE 'say $1 if /^\s PG\.DATABASE:\s (\S )/' file
這也適用于 GNU grep:
grep -oP '^\s PG\.DATABASE:\s \K\S ' file
和 GNU sed:
sed -nE 's/^\s PG\.DATABASE:\s (\S ).*/\1/p' file
或 POSIX sed:
sed -nE 's/^[[:blank:]]*PG\.DATABASE:[[:blank:]]*([^[:blank:]]*).*/\1/p' file
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/425558.html
上一篇:狗狗幣地址生成-地址無效
