代码之家  ›  专栏  ›  技术社区  ›  Yashas K.M

包含“+”的变量的grep

  •  0
  • Yashas K.M  · 技术社区  · 6 年前

    尝试使用grep拾取第二行,如果它有一个“+”字符,它就会工作

    我试过用fgrep&而不是-P尝试用Fx或x和-w,但没有一个成功。

    文件prereq.txt包含以下内容:

    WS+1                    whatever                                2222
    WS--1                   whatever2                               1111
    
    name="$(more prereq.txt | grep -P "(^|\s)$model($|\s)" | awk '{print $2}')"
    
    Result :
    
    model=WS--1
    
    Output :
    
    echo $name
    
    whatever2
    

    它在某些地方起作用——或者——但是如果它有“+”的话,dosent也起作用

    Result :
    
    model=WS+1
    
    Output :
    
    echo $name
    

    预期结果:

    model=WS+1
    
    Output :
    
    echo $name
    whatever
    
    0 回复  |  直到 6 年前
        1
  •  2
  •   finswimmer    6 年前

    问题是 grep 解释 + 作为量词而不是字符串。

    您可以使用 awk 一个人。

    $ model=WS--1
    $ awk -v model=$model '$1==model {print $2}' prereq.txt
    whatever2
    

    $ model=WS+1
    $ awk -v model=$model '$1==model print {$2}' prereq.txt
    whatever
    

    -v model=$model 我们设置了 锥子 变量 model 壳值为 模型 . 然后,对于第一列具有此值的每一行,打印第二列。

        2
  •  1
  •   ruakh    6 年前

    Perl可能更容易做到这一点,因为Perl的regex支持 \Q...\E 禁用插值变量中任何特殊字符的符号:

    name="$(
      export model # export $model into environment
      perl -ne ' if (m/(^|\s)\Q$ENV{model}\E($|\s)/) {
                   my @fields = split /\s+/, $_;
                   print "$fields[1]\n";
                 }
               '
    )"
    
        3
  •  0
  •   Walter A    6 年前

    你可以用

    model="WS[+]1"
    grep -P "(^|\s)$model($|\s)" prereq.txt | awk '{print $2}'