gpt4 book ai didi

bash - 使用 Perl 的列过滤器表达式的正确联机程序是什么?

转载 作者:行者123 更新时间:2023-12-05 08:29:23 24 4
gpt4 key购买 nike

我尝试在 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

问题

为什么会出现重复?使用命令行工具获得的结果是否正确?

配置文件

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

最佳答案

我建议将 -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

关于bash - 使用 Perl 的列过滤器表达式的正确联机程序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70959803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com