首页 > 解决方案 > Perl 无法截断字符串

问题描述

我正在尝试从命令“dspmq”的输出中提取 AAA 和 BBB。$ dspmq<- 这个命令给出的输出为 -->

QMNAME(AAA)                                           STATUS(Running)
QMNAME(BBB)                                           STATUS(Running)

但它不适用于以下代码。

perl -e 'use Data::Dumper qw(Dumper);my @qmgrlist = `dspmq`;$size = @qmgrlist;foreach my $i (@qmgrlist){my @temp1 = split /QMNAME\(/, $i;print @temp1;}'
AAA)                                           STATUS(Running)

BBB)                                           STATUS(Running)

我能够截断"QMNAME("但无法截断AAAand右侧的那些BBB。基本上我想得到 和 之间的"QMNAME("字符串")"。请协助。

标签: stringperlibm-mqtruncate

解决方案


试试这个 perl 单行:
dspmq | perl -lne 'print for m{ QMNAME [(] ( [^)]* ) [)] }x'


在这里,dspmq使用管道将 STDOUT 输入|到 perl 代码的 STDIN,它具有以下标志:
-e告诉 Perl 解释器查找内联代码,而不是在单独的脚本文件中查找代码。
-n将输入逐行馈送到内联代码(这样您就不需要将输出存储在数组中 - 这对于大输出很重要,而不是您的情况)。
-l在将输入记录分隔符(*NIX 上的换行符)提供给代码之前将其剥离,并在 during 之后自动附加它print

print ... for ... m{... (...) ...}代码打印括号中捕获的每个模式。
捕获的模式是,它是字符类中列出( )[^)]*的最大字符数(0 或更多),即不是右括号。是文字括号转义为字符类以提高可读性。我更喜欢这样逃避:. 用于明确程序员的意图:您希望 QMNAME 后面的字符串在括号中。我更喜欢使用字段索引,例如 1,它可以保护您免受在不同选项、不同系统等上使用的命令输出的微小变化。 最后,正则表达式修饰符^
[(] ... [)]\( ... \)
QMNAME
xm{...}x允许忽略注释和空格,并且是可读性的首选。

相关:
削减 dspmq 命令的输出


推荐阅读