如何在%%或$$中间grep / split一个单词

时间:2012-07-11 13:00:32

标签: linux perl split grep

我有一个变量,我必须在%%的中间加上以$$开头的单词。我使用拆分工作......但仅适用于某些情况。

示例:

#!/usr/bin/perl
my $lastline ="%Filters_LN_RESS_DIR%\ARC\Options\Pega\CHF_Vega\$$(1212_GV_DATE_LDN)";
my @lastline_temp = split(/%/,$lastline);
print @lastline_temp;
my @var=split("\\$\\$",$lastline_temp[2]);
print @var;

我按预期得到了o / p。但是我可以使用Grep命令获得相同的效果。我的意思是我不想使用array[2]array[1]。这样我就可以轻松地替换这些值。

2 个答案:

答案 0 :(得分:1)

首先,在使用引号时要非常小心,我不确定你的意思是不是 '%Filters_LN_RESS_DIR%\ARC\Options\Pega\CHF_Vega\$$(1212_GV_DATE_LDN)' 代替 "%Filters_LN_RESS_DIR%\ARC\Options\Pega\CHF_Vega\$$(1212_GV_DATE_LDN)" 这可能是一个不同的字符串。例如,如果进行评估,"$$"表示变量$PROCESS_ID

在尝试解决谜语(不确定)之后,引用你的字符串

my $lastline = 
          '%Filters_LN_RESS_DIR%\ARC\Options\Pega\CHF_Vega\$$(1212_GV_DATE_LDN)'

不同,我会使用:

my ($w1, $w2) = $lastline =~ m{ %        # the % char at the start
                               ([^%]+)   # CAPTURE everything until next %
                                [^(]+    # scan to the first brace
                                \(       # hit the brace
                               ([^)]+)   # CAPTURE everything up to closing brace
                              }x;
print "$w1\n$w2";

提取你的话。结果:

Filters_LN_RESS_DIR
1212_GV_DATE_LDN

轻松替换值是什么意思?哪个值?

附录

现在让我们提取'\'分隔的“单词”。使用简单的拆分:

my @words = split /\\/,  # use substr to start split after the first '\\'
                  substr $lastline, index($lastline,'\\'); 

如果你删除最后一个条目($$(..)字符串),你会得到反斜杠之间的单词:

pop @words;                # remove the last element '$$(..)'
print join "\n", @words;   # print the other elements

结果:

ARC
Options
Pega
CHF_Vega

使用grep 更好吗?似乎:

 my @words = grep /^[^\$%]+$/, split /\\/, $lastline;

 print join "\n", @words;

也会导致:

 ARC
 Options
 Pega
 CHF_Vega

也许这就是你追求的目标?你想用这些做什么?

此致

RBO

答案 1 :(得分:1)

我真的不知道如何获得您期望的输出。因为你把数据放在“繁忙”的引号中(插值,双精度......),它会被存储为:

'%Filters_LN_RESS_DIR%ARCOptionsPegaCHF_Vega$01212_GV_DATE_LDN)'
  • 请参阅Quote and Quote-like Operators,或许阅读Interpolation in Perl
  • 请注意,反斜杠已消失。插值引号中的反斜杠只是意味着“将下一个字符视为文字”,因此您可以得到文字'A',文字'O',文字'P',....
  • '0'$((又名$REAL_GROUP_ID)的值,您无意中要求它进行插值。因此,没有序列'$$'拆分

使用grep命令可以获得相同的效果吗?这取决于“相同”是什么。您将结果保存在数组中,grep的目的是从数组中排除内容。如果使用非平凡的grep:grep {; 1 } @data,您既不会拥有数组,也不会拥有数组的输出

实际上,假设@vars中的单个字符串是“结果”,您可以使用此正则表达式获得完全相同的结果。

m/%([^%]*)$/

当然,这不过是

substr( $lastline, rindex( $lastline, '%' ) + 1 );

可以快8到10倍。