【问题标题】:How to grep/split a word in middle of %% or $$如何在 %% 或 $$ 中间 grep/拆分单词
【发布时间】:2012-07-11 13:00:32
【问题描述】:

我有一个变量,我必须从中 grep %% 中间的 which 和以 $$ 开头的单词。我使用 split 它可以工作...但仅适用于某些情况。

例子:

#!/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]。这样我就可以轻松地替换这些值。

【问题讨论】:

  • 这个很不清楚。如果一切正常,请写下您期望的正确结果。
  • 您能否显示示例输入,以及您使用的有时有效的“split”命令 - 以及当您的“split”命令失败时?

标签: linux perl split grep


【解决方案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)的值,您无意中要求它进行插值。所以有 no 序列 '$$'split 上。

你能用grep 命令得到同样的结果吗?这取决于“相同”是什么。您将结果保存在 arrays 中,grep 的目的是从数组中排除事物。如果您使用非平凡的 grep:grep {; 1 } @data,您将既没有数组,也没有数组的 输出

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

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

当然,也不过如此

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

它的运行速度可以提高 8-10 倍。

【讨论】:

    【解决方案2】:

    首先,在使用引号时要非常小心,我不确定你的意思是不是 '%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

    【讨论】:

    • 根据我的代码,我将得到 lastline_temp = Filters_LN_RESS_DIR 和 var= 1212_GV_DATE_LDN 的结果。但我需要 %% 和 $$ 之间的单词不以 (
    • 你需要'\'分隔的“单词”吗?然后,请参阅我的附录。
    • 是的.. 谢谢附录。我能够grep的话。谢谢大家的帮助!!!!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    相关资源
    最近更新 更多