string - 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("
但无法截断AAA
and右侧的那些BBB
。基本上我想得到 和 之间的"QMNAME("
字符串")"
。请协助。
解决方案
试试这个 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
x
m{...}x
允许忽略注释和空格,并且是可读性的首选。
相关:
削减 dspmq 命令的输出
推荐阅读
- java - 直接获取Base64输出,无需在desc中写入pdf
- java - Nestedscrollview 结束动画
- ubuntu - 个性化 Gitlab CE
- c# - c# - 如何将json数据存储到MySQL中
- c# - 将日期添加到日期选择器,然后将日期绑定到 Xamarin.Forms 中的 viewModel
- python - 无法从views.py 重定向
- angular - 角 6 NGRX;多重特征共享选择器
- java - 无法通过spark(2.7.7)客户端上传文件开火
- php - XMLHttpRequest 不加载jquery文件路径
- python - openpyxl 库突出显示电子表格中的多个单元格