我想从以下字符串中提取一些特定的单词: -
Exported Layer : missing_hello
Comment :
Total Polygons : 20000 (reported 100).
我想从上面的字符串中提取“missing_hello”和“2000”这个词,并希望将其显示为
missing_hello : 20000
如何在unix中执行此操作?
答案 0 :(得分:1)
在awk
:
awk -F: '/Exported Layer/ { export_layer = $2 }
/Total Polygons/ { printf("%s : %s\n", export_layer, $2); }' "$@"
如果输入是垃圾,输出也是(GIGO)。如果这些字段可以包含冒号,那么生活就会变得更加混乱。
在sed
:
sed -n -e '/Exported Layer : *\(.*\)/{s//\1 : /;h;}' \
-e '/Total Polygons : *\(.*\)/{s//\1/;x;G;s/\n//;p;}' "$@"
字段中的冒号对此sed
版本没有问题。
现在在MacOS X 10.6.7上测试。这两个脚本都包含“Total Polygons”行中数字后的注释。这两个脚本都可以很容易地修改为仅打印数字而忽略评论。有助于准确定义所有格式的可能性。
我可能实际上使用Perl(或Python)来完成这项工作;现场分裂只是凌乱,足以从这些语言中更好的设施中受益。
答案 1 :(得分:1)
请查看本指南 - http://www.grymoire.com/Unix/Sed.html
Sed肯定是值得学习的工具。我会特别注意标题为“使用\ 1保留模式的一部分”和“使用多行”的部分。
答案 2 :(得分:1)
如果你有perl,你可以使用它:
use strict;
use warnings;
my $layer;
my $polys;
while (<>) {
if ($_ =~ m{^Exported \s Layer \s : \s (\S+)}xms) {
$layer = $1;
next;
}
if ($_ =~ m{^Total \s Polygons \s : \s (\d+)}xms) {
$polys = $1;
}
if (defined $layer && defined $polys) {
print "$layer : $polys\n";
$layer = $polys = undef;
}
}
答案 3 :(得分:1)
假设miss_hello每次都是一个单词 - 你可以:
perl -lane '$el=$F[3] if(/Exported Layer/); print "$el: $F[3]" if(/Total Polygons/);'